Kom ihåg mig?
Home Menu

Menu


UPDATE och SELECT i samma query (MySQL)

 
Ämnesverktyg Visningsalternativ
Oläst 2011-01-11, 18:03 #1
Linuus Linuus är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2009
Inlägg: 890
Linuus Linuus är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2009
Inlägg: 890
Standard UPDATE och SELECT i samma query (MySQL)

Tjena

Jag har en två tabeller, produkter och varumärken. I produkt-tabellen finns ett id som pekar på ett varumärke.

Nu skulle jag vilja köra en query direkt i PHPMyAdmin som räknar hur många produkter varje varumärke har och sparar detta i fältet "prod_count" i varumärkestabellen.

Kan jag göra en SELECT och UPDATE i samma query?
Hur ser en sådan query ut i så fall?

Själva SELECT-delen är ju ganska enkel, den blir såhär:
SELECT brand_id, count(brand_id) AS prod_count FROM `products` GROUP BY `brand_id`

Därefter vill jag ju då uppdatera 'brand.prod_count' med dessa värden.

Senast redigerad av Linuus den 2011-01-11 klockan 18:17
Linuus är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-11, 18:36 #2
nosnaj nosnaj är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Mar 2005
Inlägg: 1 012
nosnaj nosnaj är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Mar 2005
Inlägg: 1 012
Varför ska du spara värdet i tabellen när du kan räkna fram det?

Men visst borde det gå, testat i stil med:

update brand set prod_count = (select count(*) from products where brand.brand_id = products.brand_id group_by brand_id)
nosnaj är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-11, 18:36 #3
KarlRoos KarlRoos är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2007
Inlägg: 1 416
KarlRoos KarlRoos är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2007
Inlägg: 1 416
Finns det någon anledning till att du vill göra dem i samma query?

Annars gör du det bara med PHP som följande:

PHP-kod:
$result mysql_query('SELECT brand_id, count(brand_id) AS prod_count FROM `products` GROUP BY `brand_id`');

while(
$item mysql_fetch_assoc($result)){
mysql_query('UPDATE `brand` SET `prod_count`=' $item['prod_count'] . ' WHERE `brand_id`=' $item['brand_id'];

KarlRoos är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-11, 19:03 #4
Linuus Linuus är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2009
Inlägg: 890
Linuus Linuus är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2009
Inlägg: 890
Tack för svaren

nosnaj: ska testa den.

Anledningen till att jag vill göra allt i ett svep i MySQL är för att jag bara ska köra queryn 1 gång. Jag har X antal tusen produkter och ett par hundra varumärken. Tidigare använde jag bara en VIEW där jag hade ett fält, prod_count, som räknades fram. Problemet är nu att jag vill visa alla varumärken samtidigt i en lista där det även står hur många produkter de har. Då måste databasen räkna hur många produkter varje varumärke har varje gång. Detta tar tid och funkar alltså inte.

Därför vill jag göra en uträkning nu och sen kommer detta värde justeras automatiskt när jag lägger till/tar bort produkter.
Linuus är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-11, 19:06 #5
nosnaj nosnaj är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Mar 2005
Inlägg: 1 012
nosnaj nosnaj är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Mar 2005
Inlägg: 1 012
Antar du har satt index osv på dina tabeller?
Att databsen börjar bli slö vid endast tusentals rader är inget bra tecken...

Men testa de två alternativ du har fått, ibland får man gå ifrån all fin normalisering
nosnaj är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-11, 20:05 #6
Linuus Linuus är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2009
Inlägg: 890
Linuus Linuus är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2009
Inlägg: 890
Citat:
Ursprungligen postat av nosnaj Visa inlägg
Antar du har satt index osv på dina tabeller?
Att databsen börjar bli slö vid endast tusentals rader är inget bra tecken...

Men testa de två alternativ du har fått, ibland får man gå ifrån all fin normalisering
Fast tänk dig att du har 1000 varumärken och 10.000 produkter. Sen ska du lista alla varumärken såhär:
Varumärke (xx produkter)

Då måste den VIEW du skapat gå igenom 10.000 rader för varje varumärke för att räkna de produkter den är relaterad till, vilket ger att den måste kolla i 1000*10.000=10 000 000 rader.

Eller har jag fel?

Inte konstigt att det tar en stund annars

(Sen kan man ju gå vidare med cache osv...)
Linuus är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-11, 20:06 #7
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Linuus; jag säger som nosnaj, har du problem med prestanda på en sån fråga du ställer någon enstaka gång så har du troligen major problem med index.

Detta är et typexempel på en fråga som man aldrig spara resultatet av utan att man tar fram den vid behov.

Så här skulle jag kunnat gjort för att lösa uppgiften (Alla kolumner i WHERE satsen ska givetvis vara indexerade på rätt sätt):

Kod:
SELECT 
    Brand_id, 
    Brand, 
    (
        select IFNULL(count(*),0) 
        FROM products 
        where brand.brand_id = products.brand_id
    ) AS Antal
FROM Brands

Då visas alla brand du har och antalet förekomster/Tupler oavsett om det är null eller inte.

Det är rent BS att subselectar skulle vara långsamma! Jag har använt 8 subselect i en dynamisk SQL-fråga mot en tabell med joinar från flera andra tabeller med drygt 200 000 personuppgifter (ett 40 tal kolumner med massor av persondata) och den var blixtsnabb.

Jag använde MS-SQL server 6.0 då

Senast redigerad av Conny Westh den 2011-01-11 klockan 20:14
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-11, 20:15 #8
Linuus Linuus är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2009
Inlägg: 890
Linuus Linuus är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2009
Inlägg: 890
Tack för svaren

Såhär blev min query till slut

Kod:
UPDATE `brands` b
SET b.prod_count = (
	SELECT count(brand_id)
	FROM `products` AS p
	WHERE b.brand_id = p.brand_id
);
Och det verkar ha blivit rätt
Linuus är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-11, 20:23 #9
Linuus Linuus är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2009
Inlägg: 890
Linuus Linuus är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2009
Inlägg: 890
Tar tillbaka det jag sa...hade visst fel!
Mixtrade lite med mina INDEX och nu verkar faktiskt min VIEW gå att använda utan längre väntetider.

Tack för det
Linuus är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-11, 20:44 #10
nosnaj nosnaj är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Mar 2005
Inlägg: 1 012
nosnaj nosnaj är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Mar 2005
Inlägg: 1 012
Citat:
Ursprungligen postat av Linuus Visa inlägg
Tar tillbaka det jag sa...hade visst fel!
Mixtrade lite med mina INDEX och nu verkar faktiskt min VIEW gå att använda utan längre väntetider.

Tack för det
Vad gör din view?

Nyfiken vad folk använder dessa till då jag i princip aldrig använder mig utav dom.
nosnaj är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 10:00.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017