Jag har 3 tabeller: Det är ett sätt som är väldigt lättöverskådligt. Jag tycker dock att MySQL presterar väldigt dåligt med den typen av frågor (IN med subselect). Tror att jag fått ihop en variant som jag hoppas ger samma resultat med lite bättre prestanda (vid lite större datamängder). Vid vilka mängder kan min kod börja bli seg? Din kod fungerar tyvärr inte, den får med filmer från kategori X. Helt omöjligt att säga vad som kan bli problem i just detta fallet. Jag vet dock att jag hade problem med en ganska komplex fråga med "...WHERE X IN (SELECT..." som tog runt 17 sekunder med några 10000 poster. Genom att göra motsvarande omskrivning tror jag jag landade mellan 1-2 sekunder. Har även varit med om andra situationer där IN med subselect tagit lång tid i MySQL, så den funktionaliteten verkar inte vara så väl optimerad. Jag har märkt nu, redan vid ca 1000 poster, att min kod börjar bli seg så jag testade din kod istället och den är i princip lika seg också. Går den att förbättra? Ingen aning om detta är bättre, du får testa: Den där koden gick kalassnabbt, men samtidigt tyckte jag inte att den gamla koden gick så långsamt nu heller... så jag vet inte riktigt vad som löste problemet, men nu fungerar det i alla fall bra.Välja alla förutom en kategori
<info>
[Movies]
ID
Title
[Categories]
ID
Category
[CategoryLinks]
ID
MovieID
CategoryID
</info>
Vill jag välja ut alla filmer från kategori X så gör jag det med:
<code>
SELECT Movies.Title FROM Movies, CategoryLinks WHERE Movies.ID = CategoryLinks.MovieID AND CategoryLinks.CategoryID = X
</code>
Nu vill jag hämta alla filmer som INTE är med i kategori X och testade:
<code>
SELECT Movies.Title FROM Movies, CategoryLinks WHERE Movies.ID = CategoryLinks.MovieID AND CategoryLinks.CategoryID <> X
</code>
Alla filmer kan ha flera kategorier och jag antar att det är det som ställer till det.
Nån som har nån lösning?
Edit:
Nu tror jag att jag fick till det med:
<code>
SELECT Title FROM Movies WHERE NOT ID IN (SELECT Movies.ID FROM Movies, CategoryLinks WHERE Movies.ID = CategoryLinks.MovieID AND CategoryLinks.CategoryID = X)
</code>
Är det rätt och är det i så fall den vettigaste lösningen?
/ThomasSv: Välja alla förutom en kategori
SELECT Movies.Title FROM
Movies LEFT JOIN
(Categories INNER JOIN CategoryLinks ON Categories.ID = CategoryLinks.CategoryID AND Categories.ID = X)
ON CategoryLinks.MovieID = Movies.ID GROUP BY Movies.Title HAVING COUNT(Categories.ID) = 0;
/JohanSv:Välja alla förutom en kategori
Edit: Nu var jag lite väl snabb. Den sorterade annorlunda mot min kod så jag blev lite lurad. Efter en närmare koll så verkar den fungera också.
/ThomasSv: Välja alla förutom en kategori
/JohanSv:Välja alla förutom en kategori
Jag har dock gjort en justering, istället för att Categories.ID = X ska tas bort så ska Categories.Removed = True tas bort.
/ThomasSv: Välja alla förutom en kategori
SELECT Movies.Title FROM
Movies
LEFT JOIN
(SELECT MovieID FROM CategoryLinks INNER JOIN Categories ON Categories.ID = CategoryLinks.CategoryID WHERE Categories.Removed = True) AS C
ON C.MovieID = Movies.ID
WHERE C.MovieID IS NULL
Ska jag vara helt ärlig så tror jag inte det kommer göra så stor skillnad, om det ens är till det bättre. Har tyvärr inga fler idéer till problemet för för tillfället.
/JohanSv:Välja alla förutom en kategori
Tack!
/Thomas