webForumDet fria alternativet
Logga in / Bli medlem

IN fungerar inte riktigt

Databaser & SQL

6 svar · 206 visningar · startad av Skarre

Medlem sedan apr. 20012 427 inlägg
Trådstart#1

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

Medlem sedan mars 20034 471 inlägg
#2

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.

Medlem sedan apr. 20012 427 inlägg
#3

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.

Medlem sedan dec. 200012 464 inlägg
#4

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.

Medlem sedan mars 20034 471 inlägg
#5

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.

Medlem sedan dec. 200012 464 inlägg
#6

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.)

Medlem sedan apr. 20012 427 inlägg
#7

Tack för förklaringen av "genvägarna"! Väldigt smidigt! :)

387 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
125 ms — deklarationer (db)
124 ms — hämta statistik (db)
135 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)