SkarreMedlem sedan apr. 20012 427 inlägg Jag använder ofta (med ASP/Access) frågor liknande den nedan för att exempelvis endast visa bildgallerier som innehåller bilder, men nu när jag för första gången testade detta i MySQL så vill det sig inte riktigt. Denna gång försöker jag visa endast de länkkategorier som innehåller länkar.
SELECT * FROM links_categories WHERE categoryid IN (SELECT DISTINCT categoryid FROM links_links)
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT DISTINCT links.categoryid FROM links_links)' at line 1
aasahMedlem sedan mars 20034 471 inlägg MySQL klarar tydligen inte - utom senaste versionen (?) - delfrågor. Detta borde funka istället:
SELECT C.* FROM links_categories C, links_links L
WHERE C.categoryid = L.categoryid;
Då kräver du ju också att id:na ska stämma.
SkarreMedlem sedan apr. 20012 427 inlägg Jag prövar, men vill gärna veta hur det går till. Vad är betydelsen av "C." och "L."? Mina sökningar efter svaret går inte speciellt bra.
LarsGMedlem sedan dec. 200012 464 inlägg C och L är bara förkortingar för tabellnamn. Ett sådant kan anges efter tabellnamnet i from-listan
from links_categories C
Man kan inte generellt säga att en fråga som
where id in (subselect)
går att skriva om med en join. I många fall kan de ge samma resultat men det är inte givet.
aasahMedlem sedan mars 20034 471 inlägg Angående C och L: LarsG har självklart rätt, men jag vill göra ett tillägg. Eftersom categoryid är ett kolumnnamn som finns i båda tabellerna så måste du ange vilken tabell du menar i frågan. Du skulle alltså kunna skriva links_categories.categoryid = links_links.categoryid . Men jag är lat och skriver inte gärna mer än jag behöver, plus att jag tycker att det blir mer lättläst med användande av alias, eftersom man då mycket snabbt ser vilken tabell man tar det ifrån. (Man slipper läsa hela namnet, lättare hålla koll på en bokstav.)
LarsG skrev:
... Man kan inte generellt säga att en fråga som
where id in (subselect)
går att skriva om med en join. I många fall kan de ge samma resultat men det är inte givet.
Det var verkligen inte min avsikt heller!!! Men i detta fall borde det vara korrekt. Jag tyckte det var självklart att mitt svar rörde den specifika frågan i tråden... uppenbarligen borde jag varit tydligare.
LarsGMedlem sedan dec. 200012 464 inlägg Ett exempel där in och join ger olika resultat
SQL>create table a(c1 int);
SQL>create table b(c1 int);
SQL>insert into a values(1);
SQL>insert into b values(1);
SQL>insert into b values(1);
SQL>select * from a where c1 in (select c1 from b);
C1
===========
1
1 row found
SQL>select a.* from a , b where a.c1 = b.c1;
C1
===========
1
1
2 rows found
select distinct a.* from a , b where a.c1 = b.c1;
ger samma resultat (i detta fall) som frågan med IN. I det generella fallet så går det inte att översätta en sub-select till en join (även om dokumenationen för Mysql påstår det.)
SkarreMedlem sedan apr. 20012 427 inlägg Tack för förklaringen av "genvägarna"! Väldigt smidigt! :)