![]() |
Utvecklar grejer till en kund som har webbhotell hos cliche. Har använt version 4.x när jag utvecklat koden, men upptäckte att cliche har version 3. Misstänker att versionsskillnaden är boven i dramat, eller är jag ute och cyklar här? Som sagt använder jag själv 4.x och får inte något felmeddelande av följande query (ej heller på scorpionshops server), men på cliche blir det fel:
Kod:
You have an error in your SQL syntax near '(SELECT p.category_id cId, Kod:
CREATE TABLE `shop_product` ( Kod:
CREATE TABLE `shop_product` ( Så här ser shop_category ut: Kod:
CREATE TABLE `shop_category` ( Mycket(!) tacksam för information om vad felet beror på! Lite kul kan man väl ha åt följande mail? Varför ens svara när man inte svarar på kundens frågor? (Ok jag vet att man får vad man betalar för, och jag ska försöka få kunden att byta webbhotell...) Citat:
|
Citat:
Subquerys kom ganska sent i mysql (v4.1 som det verkar). http://dev.mysql.com/doc/mysql/en/rewritin...subqueries.html |
Som jag misstänkte då med andra ord... Vill inte ändra min kod för att bli bakåtkompatibel egentligen. Men är det kanske dumt att använda subqueries överhuvudtaget? (Eftersom det nu kom så sent i MySQL...)
|
Om man använder mysql är subquerys dumt (eftersom det bara stöds i de senaste versionerna och mysqlinstallationer har en tendens att inte vara helt up-to-date), men annars är det ju ett utmärkt sätt att låta databasen göra jobbet istf att göra det själv i kod.
Dock är väl din fråga knappast något som verkligen kräver en subquery... Det gör den bara onödigt komplicerad. Kod:
SELECT c.category_id, c.category_name, count(*) Min query blir dessutom sannolikt snabbare eftersom den slipper göra en subquery. |
Citat:
|
OT:
Kod:
#!/usr/local/bin/perl -w Körningar (3): Kod:
COUNT(*) 10.6 seconds Kod:
* 5 seconds 100,000 frågor på en tabell med 1,000,000 rader ger en diff på ungefär 3,6% (om jag kommer ihåg min lågstadiematte rätt). I fallet med SELECT är skillnaden större, nämligen 13,8% med 1000 iterationer över 100 rader (den här växer då rätt snabbt till en betydande skillnad). |
Citat:
Jag kommer inte att lyssna på ditt tips om att specifikt ange fält, utan kör på *. Visserligen håller jag med dig om att det i teorin är bäst att ange sina fält. Dock inte i praktiken :) (Jag vet vad alla fält heter ändå. Det går även att justera detta i efterhand om man känner för det, men för att spara tid (och även få snabbare querys -- källa: grazzy) kör jag * just nu...) EDIT: Det finns ett litet problem när jag byter till din query: De kategorier som är tomma (dvs det saknas produkter i dem) kommer inte med nu, vilket jag vill att de ska göra, och få en product_count på 0 eller NULL... Ska fundera på detta efter "frukost"... |
Det brukar man lösa med LEFT JOINS vs INNER JOINS.. Du använder nu en innerjoin, det innebär att raden bara visas om det finns ett fält i båda tabellerna du joinar som stämmer. En left tar alltid med om det finns något i den vänstra.
Hmm, jag inser just att mina benchmarks visar resulta tvärtom mot all vedertagen kunskap. Kan någon vara snäll att peka ut vad jag har gjort för fel, eller uppvisa resultat som påvisar annorlunda? :) |
Citat:
Kod:
SELECT c.*, count(p.product_id) category_product_count |
Alla tider är GMT +2. Klockan är nu 21:42. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson