Avatar billede sjh Nybegynder
07. april 2007 - 01:42 Der er 54 kommentarer og
1 løsning

Er det dømt til at gå galt?

Er den her metode dømt til at gå galt?

# SQL
CREATE TABLE `mgenre` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `da` varchar(30) default NULL,
  `en` varchar(30) default NULL,
  `genre` int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `mgenre` VALUES (1,'Aktion','Action',1);
INSERT INTO `mgenre` VALUES (2,'Erotik','Adult',2);
INSERT INTO `mgenre` VALUES (3,'Eventyr','Adventure',4);
INSERT INTO `mgenre` VALUES (4,'Animation','Animation',8);
INSERT INTO `mgenre` VALUES (6,'Komedie','Comedy',16);
INSERT INTO `mgenre` VALUES (7,'Krimi','Crime',32);
INSERT INTO `mgenre` VALUES (8,'Dokumentar','Documentary',64);
INSERT INTO `mgenre` VALUES (9,'Drama','Drama',128);
INSERT INTO `mgenre` VALUES (10,'Familie','Family',256);
INSERT INTO `mgenre` VALUES (11,'Fantasi','Fantasy',512);
INSERT INTO `mgenre` VALUES (13,'Quiz','Game-Show',1024);
INSERT INTO `mgenre` VALUES (15,'Gyser','Horror',2048);
INSERT INTO `mgenre` VALUES (16,'Musik','Music',4096);
INSERT INTO `mgenre` VALUES (17,'Musikalsk','Musical',8192);
INSERT INTO `mgenre` VALUES (18,'Mystik','Mystery',16384);
INSERT INTO `mgenre` VALUES (19,'Nyheder','News',32768);
INSERT INTO `mgenre` VALUES (20,'Realitet-TV','Reality-TV',65536);
INSERT INTO `mgenre` VALUES (21,'Romantik','Romance',131072);
INSERT INTO `mgenre` VALUES (22,'Sci-Fi','Sci-Fi',262144);
INSERT INTO `mgenre` VALUES (23,'Kort','Short',524288);
INSERT INTO `mgenre` VALUES (24,'Sport','Sport',1048576);
INSERT INTO `mgenre` VALUES (25,'Underholdning','Talk-Show',2097152);
INSERT INTO `mgenre` VALUES (26,'Spænding','Thriller',4194304);
INSERT INTO `mgenre` VALUES (27,'Krig','War',8388608);
INSERT INTO `mgenre` VALUES (28,'Western','Western',16777216);

CREATE TABLE `movie` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `title` varchar(255) default NULL,
  `genre` int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `movie` VALUES (1,'Men in Black II',262161);
INSERT INTO `movie` VALUES (2,'Tomb Raider, Lara Croft',517);
INSERT INTO `movie` VALUES (3,'Terminator, The',4456449);
# SQL

// Viser alle
$strSQL = "SELECT m.id, m.title, GROUP_CONCAT(g.da ORDER BY g.da ASC SEPARATOR ' / ') AS ggenre, m.genre
FROM movie m INNER JOIN mgenre g ON (m.genre & g.genre) GROUP BY m.id ORDER BY m.id DESC;";

// Søgning på Action(1) og Sci-Fi(262144)
$strSQL = "SELECT m.id, m.title, GROUP_CONCAT(g.da ORDER BY g.da ASC SEPARATOR ' / ') AS AGenre, m.genre
FROM movie m INNER JOIN mgenre g ON (m.genre & g.genre) WHERE (1 & m.genre) AND (262144 & m.genre) GROUP BY m.id ORDER BY m.title;";
Avatar billede erikjacobsen Ekspert
07. april 2007 - 08:59 #1
Tjah - det kommer an på....

1) Du kan kun have 31 kategorier med en int
2) Din join kan ikke udnytte indexeringer. Er du i gang med at registrere Det kongelige Biblioteks samlinger, så går det måske galt. Hjemmesamlingen går godt.

Normalt vil man lave en "mange-til-mange" tabel mellem dvd-er og kategorier. Det virker som spild af plads, men sql-maskinen kan så udnytte indexering.
Avatar billede sjh Nybegynder
07. april 2007 - 09:13 #2
Det med at "join kan ikke udnytte indexeringer" betyder det at en søgning vil blive langsom ?
Avatar billede erikjacobsen Ekspert
07. april 2007 - 09:16 #3
Ja
Avatar billede sjh Nybegynder
07. april 2007 - 09:20 #4
Ok.. trode bare det var lidt smart at gøre det på den måde, men så må jeg igang med mange til mange relation ;)

Smider du lige et svar
Avatar billede sjh Nybegynder
07. april 2007 - 09:24 #5
Det vil heller ikke være smart hvis man har et felt med id fra de genre som passer til filmen. Altså genreid = "2,4,6,1,10" ?
Avatar billede erikjacobsen Ekspert
07. april 2007 - 09:31 #6
Så kan du umiddelbart have mere end 31, men sql-maskinen kan igen ikke udnytte indexering. I begge tilfælde "overtræder" du første normalform for relationelle databaser - som egentlig bare siger, at man skal have data opbevaret så sql-maskinen nemt kan udnytte dem.

En liste som "2,4,6,1,10" kan have en mening, hvis man aldrig søger eller joiner på den. Men ellers er det en "mange-til-mange" ("many-to-many" hvis du vil søge efter det på nettet), du skal have fat i.

Og endelig kan man overveje om det i virkeligheden betyder noget. Der er forskel på en applikation på din egen PC med få data (alle løsninger vil være hurtige nok), og på en mange-bruger løsning med mange forespørgsler med mange data på et delt webhotel. ;)
Avatar billede sjh Nybegynder
07. april 2007 - 19:23 #7
hmm det der index fatter jeg null af.. har prøvet at lege lidt med den her :
http://www.tonymarston.net/php-mysql/many-to-many.html

så måske du kunne hjælpe mig lidt?
Avatar billede erikjacobsen Ekspert
07. april 2007 - 19:25 #8
Jah, det er jo ikke det mest tilgængelige du har fundet. Hvad har du lavet i de 3 tabeller, der er nødvendige ?  Vi kan tænke på indexer senere - det skal bare virke først.
Avatar billede sjh Nybegynder
07. april 2007 - 19:37 #9
Ja altså faktis har jeg ikke fået lavet noget som virker.. :D kun det du kan se ^

Iden er at man kan tilføje en film og vælge flere genre og noget oprindelse (Dansk, Udenlandsk, Dansk børnefilm, Udenlandsk børnefilm) og så ville det jo være smart at lave det så der kan tilkobles flere bruger..

Så hvis du vil hjælpe med at lave de tabeller som skal bruges og lidt SQL til at hente/tilføje/slette.

Jeg vil godt smide flere point på..
Avatar billede sjh Nybegynder
07. april 2007 - 19:39 #10
du behøver ikke lave et helt php-system til mig.. bare de sqller jeg skal bruge :D
Avatar billede sjh Nybegynder
07. april 2007 - 19:40 #11
oprindelse -> den skal man bare kunne vælge én af..
Avatar billede erikjacobsen Ekspert
07. april 2007 - 20:02 #12
1) Drop dit bitfelt (eller lad det stå indtil videre, vi bruger det bare ikke)

2) Ny tabel: `filmgenre` - 3 felter, et autoinc, og så filmid (int), genreid (int)

3) Indsæt i `filmgenre`  (<auto>,1,1)  (<auto>,1,2)  (<auto>,1,7)    hvis film nummer 1 er action, erotik og krimi.

Så finder vi ud af nogle selecter senere.
Avatar billede sjh Nybegynder
07. april 2007 - 20:17 #13
Jeps -> Drop dit bitfelt..

så ser det sådan ud:

CREATE TABLE `genre` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `da` varchar(30) default NULL,
  `en` varchar(30) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `genre` VALUES (1,'Action','Action');
INSERT INTO `genre` VALUES (2,'Erotik','Adult');
INSERT INTO `genre` VALUES (3,'Eventyr','Adventure');
INSERT INTO `genre` VALUES (4,'Animation','Animation');
INSERT INTO `genre` VALUES (6,'Komedie','Comedy');
INSERT INTO `genre` VALUES (7,'Krimi','Crime');
INSERT INTO `genre` VALUES (8,'Dokumentar','Documentary');
INSERT INTO `genre` VALUES (9,'Drama','Drama');
INSERT INTO `genre` VALUES (10,'Familie','Family');
INSERT INTO `genre` VALUES (11,'Fantasi','Fantasy');
INSERT INTO `genre` VALUES (13,'Quiz','Game-Show');
INSERT INTO `genre` VALUES (15,'Gyser','Horror');
INSERT INTO `genre` VALUES (16,'Musik','Music');
INSERT INTO `genre` VALUES (17,'Musical','Musical');
INSERT INTO `genre` VALUES (18,'Mystik','Mystery');
INSERT INTO `genre` VALUES (19,'Nyheder','News');
INSERT INTO `genre` VALUES (20,'Realitet-TV','Reality-TV');
INSERT INTO `genre` VALUES (21,'Romantik','Romance');
INSERT INTO `genre` VALUES (22,'Sci-Fi','Sci-Fi');
INSERT INTO `genre` VALUES (23,'Kort','Short');
INSERT INTO `genre` VALUES (24,'Sport','Sport');
INSERT INTO `genre` VALUES (25,'Underholdning','Talk-Show');
INSERT INTO `genre` VALUES (26,'Spænding','Thriller');
INSERT INTO `genre` VALUES (27,'Krig','War');
INSERT INTO `genre` VALUES (28,'Western','Western');


CREATE TABLE `movie` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `title` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `movie` VALUES (1,'Men in Black II');
INSERT INTO `movie` VALUES (2,'Tomb Raider, Lara Croft');
INSERT INTO `movie` VALUES (3,'Terminator, The');


CREATE TABLE `movie_rel` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `movieid` int(11) unsigned NOT NULL default '0',
  `genreid` int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `movie_rel` VALUES (1,1,1);
INSERT INTO `movie_rel` VALUES (2,1,6);
INSERT INTO `movie_rel` VALUES (3,1,22);
INSERT INTO `movie_rel` VALUES (4,2,1);
INSERT INTO `movie_rel` VALUES (5,2,3);
INSERT INTO `movie_rel` VALUES (6,2,11);
INSERT INTO `movie_rel` VALUES (7,3,1);
INSERT INTO `movie_rel` VALUES (8,3,22);
INSERT INTO `movie_rel` VALUES (9,3,26);
Avatar billede erikjacobsen Ekspert
07. april 2007 - 20:31 #14
Hvad vil du så gerne spørge om ?
Avatar billede sjh Nybegynder
07. april 2007 - 20:39 #15
Ja altså indexer senere -> http://www.tonymarston.net/php-mysql/many-to-many.html -> PRIMARY KEY  (`a_id`,`b_id`)
Avatar billede erikjacobsen Ekspert
07. april 2007 - 20:48 #16
Nej, jeg mener: Hvilke SELECT-er skal vi lave - hvilke forespørgsler på dine tabeller?
Avatar billede sjh Nybegynder
07. april 2007 - 20:57 #17
Ok.. jeg vil godt have movie.title og genre.da ud.. men genre.da skal ud med komma mellem fx. Action, Sci-Fi, osv..

og så skal man kunne vælge alle som har fx. genre=Action osv..
Avatar billede sjh Nybegynder
07. april 2007 - 20:58 #18
Har prøvet lidt..

SELECT m.title, g.da
FROM movie m, genre g, movie_rel r
LEFT JOIN movie_rel ON (r.genreid=r.movieid)
Avatar billede erikjacobsen Ekspert
07. april 2007 - 21:21 #19
Lad os lige se:

1) Givet en film-id, skal du have titel og samtlige genrer ud
2) Skal du også kunne finde film, der har en given genre
3) Skal du også kunne finde film, der har en af flere genrer
4) Skal du også kunne finde film, der har alle af en liste af genrer

I alle tilfælde skal du nok lave joins mellem alle 3 tabeller. Jeg vender tilbage lidt senere.
Avatar billede sjh Nybegynder
07. april 2007 - 21:50 #20
Ja jeg skal kunne alle 4 ting + det skal være muligt at søge på selve film title, og så skal der nok kobles en bruger table på.. den kommer her:


CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `name` varchar(20) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `users` VALUES (1,'sjh');
INSERT INTO `users` VALUES (2,'erikjacobsen');


CREATE TABLE `users_movie_rel` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `userid` int(11) unsigned NOT NULL default '0',
  `movieid` int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `users_movie_rel` VALUES (1,1,1);
INSERT INTO `users_movie_rel` VALUES (2,1,2);
INSERT INTO `users_movie_rel` VALUES (3,2,3);
INSERT INTO `users_movie_rel` VALUES (4,2,1);
Avatar billede sjh Nybegynder
08. april 2007 - 08:20 #21
Når nu har jeg fået lavet det så jeg kan få title og genre ud fra movie table.

SELECT m.id, m.title, GROUP_CONCAT(g.en ORDER BY g.en ASC SEPARATOR ' / ') AS genre
FROM movie_rel mr
INNER JOIN genre g ON (mr.genreid = g.id)
INNER JOIN movie m ON (mr.movieid = m.id)
GROUP BY mr.movieid
ORDER BY m.title ASC


id | title | genre
----------------------------------------------------------
1 | Men in Black II | Action / Comedy / Sci-Fi
2 | Terminator, The | Action / Sci-Fi / Thriller
3 | Tomb Raider, Lara Croft | Action / Adventure / Fantasy


Men kan ikke finde ud af hvordan jeg så (søger) på en genre uden at genre kun viser den man (søger) på.

Altså fx. WHERE g.id = 1 så får jeg kun (Action) ud i genre, der skulle den alivel vise de andre opdelt med (/)


SELECT m.id, m.title, GROUP_CONCAT(g.en ORDER BY g.en ASC SEPARATOR ' / ') AS genre
FROM movie_rel mr
INNER JOIN genre g ON (mr.genreid = g.id)
INNER JOIN movie m ON (mr.movieid = m.id)
WHERE g.id = 1
GROUP BY mr.movieid
ORDER BY m.title ASC

id | title | genre
----------------------------------------------------------
1 | Men in Black II | Action
2 | Terminator, The | Action
3 | Tomb Raider, Lara Croft | Action
Avatar billede sjh Nybegynder
08. april 2007 - 08:23 #22
en lille fejl id kommer i den rækkefølge..

id
--
1
3
2
Avatar billede erikjacobsen Ekspert
08. april 2007 - 09:03 #23
God morgen ;)  Jeg kigger på det et par gange i dag. Men til dit spørgsmål:

SELECT m.id, m.title, GROUP_CONCAT( g.en
ORDER BY g.en ASC
SEPARATOR ' / ' ) AS genre
FROM movie_rel mr
INNER JOIN genre g ON ( mr.genreid = g.id )
INNER JOIN movie m ON ( mr.movieid = m.id )
WHERE m.id
IN (

SELECT DISTINCT movie.id
FROM movie
JOIN movie_rel ON movie.id = movie_rel.movieid
WHERE movie_rel.genreid =22
)
GROUP BY m.id
ORDER BY m.title ASC
Avatar billede sjh Nybegynder
08. april 2007 - 09:11 #24
Jamen god morgen da :D

det virker fint.. men bare give dig god tid det er jo påske ;)
Avatar billede erikjacobsen Ekspert
08. april 2007 - 10:23 #25
Ja, det er det da vist også. Hvilken forespørgsel skal vi tage næste gang ?
Avatar billede sjh Nybegynder
08. april 2007 - 10:36 #26
Ja vi kan jo forsætte fra (http://www.eksperten.dk/spm/771983#rid6701826) sådan at den kun viser dem som passer til users_movie_rel (http://www.eksperten.dk/spm/771983#rid6701803)
Avatar billede sjh Nybegynder
08. april 2007 - 10:37 #27
Avatar billede erikjacobsen Ekspert
08. april 2007 - 10:39 #28
Hmm, er det ikke bare een join mere og een where betingelse mere på brugerens id?
Avatar billede sjh Nybegynder
08. april 2007 - 10:51 #29
Jo jeg kan snart ikke gennemskuge det mere.. :D

Altså:

WHERE users_movie_rel.userid = 1 AND users_movie_rel.movieid = users_movie_rel.userid AND movie_rel.genreid =22

noget i den stil.. :D
Avatar billede sjh Nybegynder
12. april 2007 - 16:32 #30
Når fik ikke det sidste til at virke.. kan du hjælpe?
Avatar billede erikjacobsen Ekspert
12. april 2007 - 17:10 #31
Jah, måske. Du skal bare lige være lidt mere præcis om hvad der skal ud af forespørgslen.
Avatar billede sjh Nybegynder
12. april 2007 - 17:35 #32
Ja jeg vil have en søgning på som kun passer på en Bruger fx. users_movie_rel.userid = 1
Avatar billede sjh Nybegynder
12. april 2007 - 17:37 #33
se på :

INSERT INTO `users` VALUES (1,'sjh');
INSERT INTO `users` VALUES (2,'erikjacobsen');

INSERT INTO `users_movie_rel` VALUES (1,1,1);
INSERT INTO `users_movie_rel` VALUES (2,1,2);
INSERT INTO `users_movie_rel` VALUES (3,2,3);
INSERT INTO `users_movie_rel` VALUES (4,2,1);

http://www.eksperten.dk/spm/771983#rid6701610
Avatar billede erikjacobsen Ekspert
12. april 2007 - 17:44 #34
Ok, men du må have mere end en "WHERE", og hvor er den der "join mere" jeg skrev om 08/04-2007 10:39:17
Avatar billede sjh Nybegynder
12. april 2007 - 19:52 #35
Ja det var så lige det jeg havede tinkt mig at du skulle lave :D

den her virker.. der skal bare lige kobles users på..

SELECT m.id, m.title, GROUP_CONCAT( g.en
ORDER BY g.en ASC
SEPARATOR ' / ' ) AS genre
FROM movie_rel mr
INNER JOIN genre g ON ( mr.genreid = g.id )
INNER JOIN movie m ON ( mr.movieid = m.id )
WHERE m.id
IN (

SELECT DISTINCT movie.id
FROM movie
JOIN movie_rel ON movie.id = movie_rel.movieid
WHERE movie_rel.genreid =22
)
GROUP BY m.id
ORDER BY m.title ASC
Avatar billede erikjacobsen Ekspert
12. april 2007 - 19:56 #36
Nå skal jeg også lave noget ;)

Hvad om du prøvede at tilføje

INNER JOIN users_movie_rel u ON ( mr.movieid = u.movieid )

og lige før GROUP BY en

WHERE u.userid=2
Avatar billede sjh Nybegynder
12. april 2007 - 19:59 #37
du mener "AND u.userid=2" ??

SELECT m.id, m.title, GROUP_CONCAT( g.en
ORDER BY g.en ASC
SEPARATOR ' / ' ) AS genre
FROM movie_rel mr
INNER JOIN genre g ON ( mr.genreid = g.id )
INNER JOIN movie m ON ( mr.movieid = m.id )
INNER JOIN users_movie_rel u ON ( mr.movieid = u.movieid )
WHERE m.id
IN (
SELECT DISTINCT movie.id
FROM movie
JOIN movie_rel ON movie.id = movie_rel.movieid
WHERE movie_rel.genreid =22
)
AND u.userid=2
GROUP BY m.id
ORDER BY m.title ASC
Avatar billede erikjacobsen Ekspert
12. april 2007 - 20:12 #38
Ja
Avatar billede sjh Nybegynder
12. april 2007 - 20:52 #39
Ok har flyttet lidt rundt på det men det skulle vel være det samme ik ? (...WHERE u.userid = 2 AND m.id IN...)


SELECT m.id, m.title, GROUP_CONCAT(g.en ORDER BY g.en ASC SEPARATOR ' / ') AS genre
FROM movie_rel mr
INNER JOIN genre g ON (mr.genreid = g.id)
INNER JOIN movie m ON (mr.movieid = m.id)
INNER JOIN users_movie_rel u ON (mr.movieid = u.movieid)
WHERE u.userid = 2 AND m.id IN (
SELECT DISTINCT movie.id FROM movie JOIN movie_rel ON movie.id = movie_rel.movieid
WHERE movie_rel.genreid = 22
)
GROUP BY m.id
ORDER BY m.title ASC


Hvad med den Index.. -> PRIMARY KEY  (`a_id`,`b_id`)
Avatar billede erikjacobsen Ekspert
12. april 2007 - 21:21 #40
1) Der er automatisk index på en primærnøgle
2) Der bør sættes index på fremmednøgler (også selv om man ikke angiver dem som fremmednøgler). Der er typisk de felter, der ikke er primærnøgler, som man anvender i en "JOIN ON ..."
3) Dertil kommer så kunsten at se, om der er andre felter, man søger på med noget i retning af " WHERE felt='værdi' ", hvor det kan betale sig.

Et index på et felt gør søgning generelt hurtigere, men det tager længere tid at indsætte og opdatere rækker. I 3) skal man nemlig lige regne ud om de andre betingelser man har (med indexer på), vil gøre antallet af rækker, hvor man skal lave sammenligningen med " felt='værdi' ", så lille, at det ikke kan betale sig med et index.

Men lav 1) og 2), og vent og se hvor langsomt det går. Det er ikke til at vide hvilke SQL-forespørgsler du ender med, mens du udvikler. Brug gerne MySqls EXPLAIN kommando til at finde ud af hvordan en given forespørgsel udføres, og lav indexer ud fra det.
Avatar billede sjh Nybegynder
12. april 2007 - 21:23 #41
Du må også godt smide et svar..
Avatar billede sjh Nybegynder
12. april 2007 - 21:33 #42
Avatar billede erikjacobsen Ekspert
12. april 2007 - 21:58 #43
Jeg samler slet ikke på point, tak. Du kan ikke bruge en EXPLAIN før der er så mange data i tabellen, som du regner med at bruge. Måske derfor der står ALL nogle steder (indikerer et tablescan, altså en masse rækker der løbes igennem) - men det kan nemt ændre sig ved en stor tabel.
Avatar billede sjh Nybegynder
13. april 2007 - 01:00 #44
Der er da data i alle tabeller så den skulle vel virke (EXPLAIN) ?
Avatar billede sjh Nybegynder
13. april 2007 - 01:37 #45
Ok.. prøvede lige at lave et index felt på en af mine andre databaser med 212395 posts.. der kunne "man" virkelig se forskel på en ORDER BY :D
Avatar billede erikjacobsen Ekspert
13. april 2007 - 08:54 #46
Det jeg mener er at udregningsrækkefølgen også bestemmes af størrelserne af tabeller og delresultater, så man skal ikke lægge noget i at der vælges en "tablescan" for små tabeller - det kan nemt være det hurtigste. Det er først ved de store indexer bliver udnyttet fuldt ud.
Avatar billede sjh Nybegynder
13. april 2007 - 09:11 #47
God morgen :D

Fandt lige en lille fejl (WHERE dmr.genreid = 22 AND dmr.genreid = 1) Den giver null selv om genreid har både 1 og 22


SELECT m.id, m.title, GROUP_CONCAT(g.en ORDER BY g.en ASC SEPARATOR ' / ' ) AS genre
FROM movie_rel mr
INNER JOIN genre g ON (mr.genreid = g.id)
INNER JOIN movie m ON (mr.movieid = m.id)
INNER JOIN users_movie_rel u ON (mr.movieid = u.movieid)
WHERE u.userid=2 AND m.id IN
(
SELECT DISTINCT dm.id FROM movie dm JOIN movie_rel dmr ON dm.id = dmr.movieid
WHERE dmr.genreid = 22 AND dmr.genreid = 1
)
GROUP BY m.id
ORDER BY m.title ASC
Avatar billede erikjacobsen Ekspert
13. april 2007 - 09:15 #48
Et felt kan ikke have 2 værdier samtidig. Du mener nok en OR
Avatar billede sjh Nybegynder
13. april 2007 - 09:20 #49
Ja har jeg også fundet ud af.. men hvordan laver jeg det så, hvis jeg kun skal have dem frem som har "genreid" 1 og 22 ?
Avatar billede sjh Nybegynder
13. april 2007 - 09:25 #50
er det ikke noget i den stil..

SELECT * FROM movie_rel WHERE genreid = 6 OR genreid = 1 GROUP BY movieid HAVING COUNT(*) > 1
Avatar billede sjh Nybegynder
13. april 2007 - 09:28 #51
Jo den her giver kun 1 record

SELECT m.id, m.title, GROUP_CONCAT(g.en ORDER BY g.en ASC SEPARATOR ' / ' ) AS genre
FROM movie_rel mr
INNER JOIN genre g ON (mr.genreid = g.id)
INNER JOIN movie m ON (mr.movieid = m.id)
INNER JOIN users_movie_rel u ON (mr.movieid = u.movieid)
WHERE u.userid=2 AND m.id IN
(
SELECT DISTINCT dm.id FROM movie dm JOIN movie_rel dmr ON dm.id = dmr.movieid
WHERE dmr.genreid = 6 OR dmr.genreid = 1 GROUP BY dmr.movieid HAVING COUNT(*) > 1
)
GROUP BY m.id
ORDER BY m.title ASC


ellers vil den give 2 records ;)
Avatar billede sjh Nybegynder
13. april 2007 - 09:33 #52
hmm nææ det går nok ikke.. ?? COUNT(*) = ??

WHERE dmr.genreid = 6 OR dmr.genreid = 1 GROUP BY dmr.movieid HAVING COUNT(*) = 2

WHERE dmr.genreid = 6 OR dmr.genreid = 1 OR dmr.genreid = 22 GROUP BY dmr.movieid HAVING COUNT(*) = 3
Avatar billede sjh Nybegynder
16. april 2007 - 09:48 #53
Når du skal have lidt point.. skal vi så ikke dele de point når du nu ikke samler på dem.. :D
Avatar billede erikjacobsen Ekspert
16. april 2007 - 09:59 #54
Nej tak, ingen point til mig. Det er jo heller ikke super-service, der leveres.
Hvis det tager længere tid for mig end 30 sekunder, at udtænke et svar, så bliver sådan et spørgsmål g(l)emt. ;(
Avatar billede sjh Nybegynder
16. april 2007 - 10:39 #55
okææ æv.. så må jeg vel tag dem selv.. :D men mange tak for en stor hjælp.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester