Kom ihåg mig?
Home Menu

Menu


SQL hämta rader med vissa ord i

 
Ämnesverktyg Visningsalternativ
Oläst 2013-06-20, 10:37 #1
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Standard 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?
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-20, 10:56 #2
corneliisandberg corneliisandberg är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2012
Inlägg: 33
corneliisandberg corneliisandberg är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2012
Inlägg: 33
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!
corneliisandberg är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-20, 10:57 #3
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Hmm det hade jag inte tänkt på alls faktiskt. Tack du ^_^
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-20, 11:04 #4
corneliisandberg corneliisandberg är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2012
Inlägg: 33
corneliisandberg corneliisandberg är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2012
Inlägg: 33
Varsågod och det är aldrig fel att fråga (efter att man har provat såklart
corneliisandberg är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-20, 12:09 #5
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
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).
Clarence är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-20, 13:28 #6
corneliisandberg corneliisandberg är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2012
Inlägg: 33
corneliisandberg corneliisandberg är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2012
Inlägg: 33
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.
corneliisandberg är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-20, 13:43 #7
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
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 ^_^

Senast redigerad av Anaxa den 2013-06-20 klockan 13:46
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-20, 14:15 #8
corneliisandberg corneliisandberg är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2012
Inlägg: 33
corneliisandberg corneliisandberg är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2012
Inlägg: 33
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!
corneliisandberg är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-20, 14:21 #9
christian. christian. är inte uppkopplad
Nykomling
 
Reg.datum: Apr 2013
Inlägg: 29
christian. christian. är inte uppkopplad
Nykomling
 
Reg.datum: Apr 2013
Inlägg: 29
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.

Senast redigerad av christian. den 2013-06-20 klockan 14:26
christian. är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-20, 16:32 #10
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Citat:
Ursprungligen postat av corneliisandberg Visa inlägg
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).
Clarence är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 11:38.

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