Kom ihåg mig?
Home Menu

Menu


SQL hämta rader med vissa ord i

 
Ämnesverktyg Visningsalternativ
Oläst 2013-06-23, 02:54 #1
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Det mest grundläggande inom normalisering är att varje kolumn ska innehålla atomära värden, dvs du lägger ALDRIG ihop flera värden i samma kolumn. Det är 1NF (första normalformen).

3NF innebär att varje atomärt värde ska vara beroende av hela primärnyckeln och inget annat än primärnyckeln, ... so help me Codd som man brukar säga... (Codd var en matematiker som definierade normaliseringen i relationsdatabaser).
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-23, 14:55 #2
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
Okej conny, så om alla filmer enligt min tabell har likadant årtal i sitt 'year' fält så strider det emot tredje formens normalisering?

Jag funderade också hur på jag ska hämta alla filmer som har genrerna komedi och skräck.

Jag provade:
PHP-kod:
string(149"SELECT * FROM movies JOIN movie_genres ON movie_genres.movie_id = movies.id WHERE movie_genres.genre_id = 2 AND movie_genres.genre_id = 1 LIMIT 0, 30" 
vilket inte jag mig någonting eftersom samma värde kan inte vara 2 olika saker samtidigt. Men detta är det bästa jag kan komma på.
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-23, 22:37 #3
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av Anaxa Visa inlägg
Okej conny, så om alla filmer enligt min tabell har likadant årtal i sitt 'year' fält så strider det emot tredje formens normalisering?

Jag funderade också hur på jag ska hämta alla filmer som har genrerna komedi och skräck.

Jag provade:
PHP-kod:
string(149"SELECT * FROM movies JOIN movie_genres ON movie_genres.movie_id = movies.id WHERE movie_genres.genre_id = 2 AND movie_genres.genre_id = 1 LIMIT 0, 30" 
vilket inte jag mig någonting eftersom samma värde kan inte vara 2 olika saker samtidigt. Men detta är det bästa jag kan komma på.
Kan du lägga upp DDL-scriptet och ett script med INSERT av data i alla tabellerna så underlättar det om du vill ha hjälp, så slipper jag sitta och knappa in detta manuellt....
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-23, 23:44 #4
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
http://www.anaxa.se/sql.sql (kolumnen 'genres' i 'movies' skall tas bort. Han inte göra det innan jag exporterade)

Jag löste det jag vill ha hjälp med och det var att hämta ALLA filmer vars genrer kan vara både Action och Skräck. Alltså inte filmer som bara ha action och bara har skräck utan som har båda två.
Detta funkar bra med denna query:
PHP-kod:
SELECT m.* FROM movies m JOIN movie_genres mg ON mg.movie_id m.id AND mg.genre_id IN (111GROUP BY m.id HAVING COUNT(DISTINCT mg.genre_id) = 2 ORDER BY m.date ASC 
Här representerar 1 och 11 genrens ID

Men nu vill jag också hämta ALLA genrer en film har och lägg till det på ett eget fält: Action,Skräck,Komedi (det behöver inte vara avgränsat med komma). Bara så att jag kan få ut datan så att jag kan bearbeta den med PHP. Jag provade med detta:
PHP-kod:
SELECT m.*, GROUP_CONCAT(genres.name) AS genre_field FROM movies m JOIN movie_genres mg ON mg.movie_id m.id AND mg.genre_id IN (1,11JOIN genres ON mg.genre_id genres.id GROUP BY m.id HAVING COUNT(DISTINCT mg.genre_id) = 2 ORDER BY m.date ASC LIMIT 030 
Men ovanstående ger mig bara en rad med ett fält som heter genre_field med värdet 'Action,Skräck'. Värdet ska egentligen bli 'Action,Skräck,Fantasy'(alla genrer).

Filmen i fråga är Hansel och Gretel som ligger i movies-tabellen.
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-24, 00:05 #5
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Citat:
Ursprungligen postat av Anaxa Visa inlägg
Jag löste det jag vill ha hjälp med
"Jag"
yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-24, 00:49 #6
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av Anaxa Visa inlägg
Men nu vill jag också hämta ALLA genrer en film har och lägg till det på ett eget fält: Action,Skräck,Komedi (det behöver inte vara avgränsat med komma). Bara så att jag kan få ut datan så att jag kan bearbeta den med PHP. Jag provade med detta:
.
.
.
Citat:
Ursprungligen postat av Anaxa Visa inlägg
Men ovanstående ger mig bara en rad med ett fält som heter genre_field med värdet 'Action,Skräck'. Värdet ska egentligen bli 'Action,Skräck,Fantasy'(alla genrer).

Filmen i fråga är Hansel och Gretel som ligger i movies-tabellen.
Blir bättre om du använder CODE och /CODE -taggarna i stället för PHP /PHP....

Är det så här du menar?

Kod:
use anaxa;

SELECT m.*, GROUP_CONCAT(genres.name) AS genre_field 
FROM movies m 
JOIN movie_genres mg ON mg.movie_id = m.id AND mg.genre_id IN (select id from genres) 
JOIN genres ON mg.genre_id = genres.id 
GROUP BY m.id 
HAVING COUNT(DISTINCT mg.genre_id) = 2 
ORDER BY m.date ASC LIMIT 0, 30;

Senast redigerad av Conny Westh den 2013-06-24 klockan 00:58
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-06-24, 01:36 #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
Inte riktigt.

Säg att en film har 5 olika genrer, Äventyr, Action, Komedi, Skräck och Sport. Vi kan även anta att det finns flera filmer som har liknande genrer.

Nu vill jag filtrera filmerna för att få fram alla de filmer som har både Action och Skräck som genrer. Detta löser jag igenom att köra:
Kod:
SELECT m.* FROM movies m JOIN movie_genres mg ON mg.movie_id = m.id AND mg.genre_id IN (1, 11) GROUP BY m.id HAVING COUNT(DISTINCT mg.genre_id) = 2 ORDER BY m.date ASC  
// Där 1, 11 representerar genrernas ID.
Här hämtar jag data enbart ifrån 'movies'. So far so good.
Men nu kommer vi till de knepiga och själva problemet.
Jag vill samtidigt hämta alla genrer som hör till en viss film. Detta gör jag för informationssyfte. Liksom att bara visa vilka genrer en specifik film har.
Anaxa ä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 17:53.

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