webForumDet fria alternativet

SQL-sats funkar i MySQL 5.0, men ej 4.1

Databaser & SQL

4 svar · 320 visningar · startad av Denkan

Medlem sedan juni 2002256 inlägg
Frågan#1

Tjenixen,
Har stött på ett MySQL-problem jag inte tycker är riktigt rättfärdigt :OO

Strukturen är enkel; jag har bilder som läggs in i olika kategorier (även underkategorier).

Inga konstigheter med tabellerna:

[B][Categories][/B]
CatID    int(11)  auto_increment               
RefCatID int(11) 
Name     varchar(100)

[B][Images][/B]
ImageID  int(11)  auto_increment               
CatID    int(11)  
FileName varchar(255) 
(...)

Då jag vill plocka ut lite värden, inkl. antalet underkategorier och bilder som finns, från en särskild kategori använder jag följande SQL-sats:

SELECT 
   c1.CatID, 
   c1.RefCatID, 
   c1.Name, 
   [red](SELECT COUNT(*) FROM categories c2 WHERE c2.RefCatID=c1.CatID) As Subcats, 
   (SELECT COUNT(*) FROM images WHERE CatID=c1.CatID) As Images [/red] 
FROM categories c1 
WHERE c1.RefCatID=0 
ORDER BY CatID asc

Detta fungerar fint på min jobbdator där jag kör MySQL 5.0. När den körs på webbhotellet som använder MySQL 4.1 klagar den dock på rödmarkerad text.
Är jag ute och snurrar som skriver som jag gör? Någon som har bättre lösning på hur jag får med antal underkategorier och antal bilder i SQL-satsen?
Jag antog att det inte är speciellt krävande iom det endast hämtar en liten COUNT() från de andra tabellerna, men jag kanske har fel?
Har denna typ av SELECT-möjlighet inte varit tillgänglig förrän i version 5, kanske?

Felmeddelandet ser ut som de flesta SQL-fel:

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 COUNT(*) FROM images WHERE CatID=c1.CatID) As Images FRO

Uppskattar om någon kan upplysa mig =)
Tackar på förhand!

Medlem sedan jan. 20023 327 inlägg
#2
   (SELECT COUNT(*) FROM categories c2 WHERE c2.RefCatID=c1.CatID) As Subcats, 
   (SELECT COUNT(*) FROM images WHERE CatID=c1.CatID) As Images

Jag tror det beror på att mySQL 4.1 inte har stöd för as, dvs att du namnger resultatet av en aggregatfunktion.

/r så är det inte. mySql 4.1 har stöd för det också.

Medlem sedan dec. 19996 721 inlägg
#3

Prova med

SELECT 
   c1.CatID, 
   c1.RefCatID, 
   c1.Name,
   COUNT(DISTINCT c2.CatID) as SubCats,
   COUNT(DISTINCT i.ImageID) as Images
FROM categories c1 
LEFT OUTER JOIN categories c2 ON c2.RefCatID=c1.CatID
LEFT OUTER JOIN images i ON i.CatID=c1.CatID
WHERE c1.RefCatID=0
GROUP BY c1.CatID, 
   c1.RefCatID, 
   c1.Name
ORDER BY c1.CatID asc
Medlem sedan juni 2002256 inlägg
#4

emission, det verkar fungera fantastiskt bra!
Tackar så mycket för hjälpen!

Vet du orsaken till att min snutt inte fungerade?
Inte bra att skriva som jag gjort?

Medlem sedan dec. 19996 721 inlägg
#5

Njae, MySQL 4.1 var den första versionen av MySQL som kunde hantera subqueries, och den är väl helt enkelt lite nybörjare och inte så bra på det.

260 ms totalt · 3 externa anrop · v20260731065814-full.767b4345
132 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)