WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   SQL hämta rader med vissa ord i (https://www.wn.se/forum/showthread.php?t=1058305)

Anaxa 2013-06-20 10:37

SQL hämta rader med vissa ord i
 
Jag har flera rader videos i en rad och varje rad har en kolumn som heter genres.

kolumnen kan innehålla flera genres som är avgränsade. Det kan också innehålla endast 1 genre. Lat som jag är har jag inte strippat den sista '|' men jag hoppas på att det kommer lösas ändå. Såhär kan kolumnen se ut:

musical|
family|comedy|
horror|comedy|action|
action|adventure|comedy|

Om jag nu vill hämta alla rader där comedy finns med, hur ska jag då gå tillväga för att lösa detta? Måste jag splitta kolumnen i flera bitar först?

corneliisandberg 2013-06-20 10:56

Hej Anaxa!
Om du behöver få ut rader från kolumnen genre som innehåller ordet "comedy" ska det här fungera bra för MySql.

SELECT * FROM videoTable WHERE genre LIKE '%comedy%'

Detta var ett sätt att lösa det på.

Lycka till!

Anaxa 2013-06-20 10:57

Hmm det hade jag inte tänkt på alls faktiskt. Tack du ^_^

corneliisandberg 2013-06-20 11:04

Varsågod och det är aldrig fel att fråga (efter att man har provat såklart ;)

Clarence 2013-06-20 12:09

Värt att notera är att en LIKE '%...%' kommer slöa ner din databas rejält när du får lite mer data. Alternativen är att strukturera din data bra (3NF) eller skapa ett sökindex i annan mjukvara. Ska tabellen inte växa ordentligt med tiden finns det dock ingen poäng att oroa sig (med många frågor så kommer query cachen ta hand om problemet).

corneliisandberg 2013-06-20 13:28

Jag håller med Clarence. När du får lite storlek på din databas så bör du funderar på andra lösningar eller åtminstone lägga dit ett index på genre med en längd på kanske 15 char.

Du kan också skapa en separat tabell där filmen finns med flera gånger, en gång per kategori (en->många). Men JOINS är inte heller alltid så snabba men det vi pratar om här att optimera sina sql-frågor blir ju lite överkurs om Anaxas databas innehåller litet antal poster.

Anaxa 2013-06-20 13:43

2 tabeller
PHP-kod:

// movies
    
ID PRIMARY_KEY
    Name
    Date_Added
    Director
    URL
    Likes
    Genres
    Views
    
// genres
    
ID PRIMARY_KEY
    Name
    Machine_Name 

Alltså movies.Genres kan innehålla action|comedy|family och det är dessa 3 som pekar mot genres.Machine_Name

Vet inte hur jag kan förbättra sånt här faktiskt. Jag har tänkt en hel del men jag fastnade som sagt vid sökningen efter genre(vilket jag löst nu tack vare corneliisandberg)

EDIT:
En idé jag har är att skapa en tredje tabell med 3 kolumner (id,movie_id, genre_id). Så för varje genre en film har så lägger jag bara till 1 rad? Är osäker på om det är snabbare eller inte. Det får ni som kan det avgöra ^_^

corneliisandberg 2013-06-20 14:15

Tack Anaxa för ditt exempel. Nu blir det lättare att se vart du fastnar vid snabb skummning.

Kolumnen "Genres" i tabellen movies är överflödig på det viset jag tänker mig. Finns många sätt men jag ger dig ett alternativ.


// movies
ID PRIMARY_KEY
Name
Date_Added
Director
URL
Likes
Views

// genres
ID PRIMARY_KEY
MovieId (detta ger kopplingen till själva filmen ovan)
Name
Machine_Name (OT:?)

Movies låtsas vi innehåller detta
1, Det våras för Bamse, 12345678, George Lucas, www.bamse.se,12,5
2, Gökboet, 12345678, Steven S, www.gok.se,8,6
3,Excorsisten,12245987,Stephen Best,www.exco.se,34,4

Genres innehåller detta
1,1,Cartoon,?
2,1,Barnaction,?
3,1,Icke våld,?
4,2,Thriller,?
5,2,Ondska,?
6,3,Ondska,?

För att hämta alla filmer som är "Cartoon" skriv följande fråga
SELECT * FROM movies
JOIN genres
ON genres.MovieId = movies.ID
WHERE genres.Name = 'Cartoon'

För att hämta alla filmer som är "Ondska"
SELECT * FROM movies
JOIN genres
ON genres.MovieId = movies.ID
WHERE genres.Name = 'Ondska'

Du ser nu att du alltså kan addera flera filmtitlar via filmens id i tabellen genres via kolumnen MoviesId som vi har där.

Som alltid måste alla kolumner och frågor vara rättstavade och konsekventa, något jag frisvär mig ifrån sittandes på jobbet som jag är ;)

Men jag hoppas du förstår poängen och vart du fastnade lite i tankesättet.

Lycka till och berätta gärna hur det går för dig!

christian. 2013-06-20 14:21

Jag skulle ha gjort såhär:
Kod:

movies
id
title

genres
id
title

genres_movies
id
movie_id
genre_id

Sen för att visa filmer för en viss genre om du har urlen http://dinsida.se/genre?id=2:
Kod:

$genre_id = mysql_real_escape_string($_GET['id']);

SELECT
    movies.id, movies.title
FROM
    movies
JOIN
    genres_movies
ON
    genres_movies.movie_id = movies.id
WHERE
    genres_movies.genre_id= '$genre_id'

Skriver aldrig raw sql längre så har ej testat koden, men något liknande i alla fall.

Clarence 2013-06-20 16:32

Citat:

Ursprungligen postat av corneliisandberg (Inlägg 20472333)
Jag håller med Clarence. När du får lite storlek på din databas så bör du funderar på andra lösningar eller åtminstone lägga dit ett index på genre med en längd på kanske 15 char.

Det skulle isåfall bli ett index som inte används alls för frågan ... Ett index är sorterat, med %..% kan du inte söka sorterat.

Till TS: Strukturen som ges av föregående skribenter är vad som kallas normalisering. Det gör det mycket flexiblare att ställa frågor, uppdatera delar av datan samt att det ger dig bättre förutsättningar att skriva effektiva queries (%..% funkar absolut bara i liten skala, t ex).


Alla tider är GMT +2. Klockan är nu 06:32.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson