Autor Zpráva
czechiaa
Profil
Ahojte,

řeším problém - pro mnohé bude primitivní, ale já si s ním s*ru už dvě noci :X .. mám dvě tabulky

uzivatele
| nick | hodnota1 | hodnota2 | hodnota3 |
pepa | 100 | 100 | 100 |
franta | 100 | 100 | 100 |

a veci
| id | hodnota1 | hodnota2 | hodnota 3 |
1 | 30 | 40 | 50 |
2 | 80 | 40 | 50 |

a nyní problém - potřeboval bych, aby se hodnoty věci 1 přidali pepovým hodnotám. Tzn. hodnota1 (věci) se přidá pepově hodnotě1 .. hodnota2 (věci) se přidá (pepově) hodnotě2 .. atd.
Zkoušel jsem to přes SELECT, sloučení a poté UPDATE, ale nikdy to nevyšlo a nyní chci začít todle řešit od začátku, má někdo nějakej nápad? Postačí mi i prostě popostrčení, jak dotaz konstruovat. Potřebuju pouze popošťouchnout s dotazem, zbytek zvládnu ;)

Předem děkuju za reakce :)
Tori
Profil
edit: Původně jsem to napsala celé, ale když chcete jen pošťouchnout, tak tedy: UNION ALL (oba samostatné dotazy), a nad výsledkem SELECT + SUM. ;)
Sloupce uzivatel.hodnota1 a veci.hodnota1, + ostatní páry, by měly mít kompatibilní datové typy.
czechiaa
Profil
A nemáte to ještě napsané celé? v tomdle se maličko ztrácím O:)
Tori
Profil
SELECT SUM(hodnota1), SUM... FROM
((SELECT hodnota1, ... FROM uzivatele WHERE... )
UNION ALL
(SELECT hodnota1, ... FROM veci WHERE...)
ORDER BY NULL) tmp
1. možná bude potřeba doplnit aliasy k některým poddotazům
2. možná nebude potřeba ORDER BY NULL (nepamatuju si z hlavy, jestli se defaultně řadí nebo ne, najděte si to v man.) - a pokud ne, tak jsou zbytečné i závorky okolo těch dvou poddotazů s WHERE. Okolo celého UNION ale musí závorky zůstat.
3. páry stejnojmenných sloupců (uzivatele.hodnota1 + veci.hodnota1) musí mít stejný nebo podobný datový typ.
czechiaa
Profil
1. A to z jakého důvodu? (Ptám se informativně)
2. Man. prozkoumám ;)
3. Ani, to mají ;-

Osobně jsem si to představoval, že to bude jednodušší. Na internetu je mnoho příkladů a návodu na různé INSERTy, SELECTy a UPDATy, které zvládám, ale orientace a pochopení tohoto dotazu je pro mě celkem oříšek. Bohužel jsem ani takovýto dotaz nikde nenašel, abych se ho pokusil nějak poskládat. btw. díky ;-)
Tori
Profil
Jeden SELECT vám udělá tabulku dat. Ze SELECT neco a SELECT neco jineho vám vzniknou dvě tabulky a UNION je slepí dohromady, aby se s nimi dalo pracovat jako s jedinou dlouhou. Ad aliasy - zkusila jsem si to a alias musí určitě mít celý ten union, doplnila jsem do [#4]. Jinak zkuste se na větším vzorku dat podívat na výsledky EXPLAIN (počet použitých řádků, klíče, rychlost dotazu), jestli by nebylo efektivnější sčítat to i v poddotazech (tj. SUM(hodnota1) as hodnota1 .. FROM uzivatele). A neni zač. :)
Kajman
Profil
czechiaa:

Ten součet se má trvale uložit do řádku s pepou nebo to chcete jen vypsat?
czechiaa
Profil
Tori:
S tímhle už to postavit zvládnu, snad :-) odpoledne to vyzkouším. ;-)
Kajman:
Ten součet se má uložit do pepových řádků :-)

Až teď jsem si uvědomil, že Tori mi sice poskytla návod, ale na SELECT :-( Já bych potřeboval nejspíše UPDATE :-(
Tori
Profil
To by mělo být jednodušší. Asi nějak takhle? (doufám, že to bude sumovat správně, nemůžu to teď zkusit)
UPDATE uzivatele u, veci v
SET u.hodnota1 = u.hodnota1 + SUM(v.hodnota1), ...
WHERE u.nick = pepa AND v.id = 1
czechiaa
Profil
Tori:
Toto vypadá správně, bohužel nyní nemám přístup na pc, takže vyzkouším odpoledne a pošlu reakci ;-)
Kajman
Profil
Spíše to bude něco jako
UPDATE uzivatele u,
       veci v
SET    u.hodnota1 = Ifnull(u.hodnota1, 0) + Ifnull(v.hodnota1, 0),
       u.hodnota2 = Ifnull(u.hodnota2, 0) + Ifnull(v.hodnota2, 0),
       u.hodnota3 = Ifnull(u.hodnota3, 0) + Ifnull(v.hodnota3, 0)
WHERE  u.nick = 'pepa'
       AND v.id = 1

Ale čísla ve sloupcích zavání špatným nvárhem.
czechiaa
Profil
Jak jako "špatným návrhem"? :O Jestli jde o to, jak se nazývají sloupce, tak je to opravdu tak lepší. Protože vlastně uživatel má sloupec, "peníze" a potřebují přičíst "peníze" z tabulky věcí dle ID ;-) Lépe se v tom orientuj, tedy osobně pro mě :-) .. Ale jinak díky za další vadiantu, vyzkouším obě a dám vědět :-)
A jinak - dělám si webovky pro zábavu, takze takovéhle věci zatím neřeším ;-) a není snad lepší to tahat z jedné tabulky, něž ze tří? ;-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: