Portál AbcLinuxu, 12. května 2025 16:53

Dotaz: MySQL - podmínka pro sloupec

17.9.2012 11:23 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
MySQL - podmínka pro sloupec
Přečteno: 412×
Odpovědět | Admin
V MySQL mám takovou tabulku -
+----+------------+----------+----------+
| id | product_id | group_id | price    |
+----+------------+----------+----------+
| 61 |          3 |        0 |   100.00 |
| 62 |          3 |        2 |   100.00 |
|  6 |          4 |        0 | 10000.00 |
+----+------------+----------+----------+

A jde mi zde o sloupec group_id. Potřeboval bych z této tabulky dostat takové řádky, že pokud bude obsahovat pro jeden product_id jak řádek s group_id=0, tak i s group_id=2, tak aby mi to vrátilo řádek s group_id=2, ale pokud pro daný product_id bude jenom group_id=0, tak aby mi to vrátilo řádek s group_id=0. Zkoušel jsem už různé možnosti, ale nějak se mi nedaří přijít na to jak definovat WHERE podmínku.

Předem děkuji za rady.
Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

17.9.2012 12:43 darkenik
Rozbalit Rozbalit vše Re: MySQL - podmínka pro sloupec
Odpovědět | | Sbalit | Link | Blokovat | Admin
nieco take by mohlo fungovat select * from tabulka where (group_id > 0) OR ( group_id=0 AND NOT group_id > 0);
17.9.2012 12:56 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
Rozbalit Rozbalit vše Re: MySQL - podmínka pro sloupec
To bylo to první co jsem zkoušel
SELECT id, product_id, group_id, price FROM tabulka WHERE group_id=2 OR (group_id=0 AND NOT group_id=2)
a toto mi to vyplivne:
+----+------------+----------+--------+
| id | product_id | group_id | price  |
+----+------------+----------+--------+
| 61 |          3 |        0 | 100.00 |
| 62 |          3 |        2 | 100.00 |
+----+------------+----------+--------+
17.9.2012 13:30 kuka
Rozbalit Rozbalit vše Re: MySQL - podmínka pro sloupec
(group_id=0 AND NOT group_id=2) ma delat co? Cele je to z principu nesmysl, protoze podminka se aplikuje na jeden radek tabulky, tzn. nemuze jakkoliv osetrit existenci jineho radku s nejakymi vlastnostmi. SQL na toto nema moc hezke prostredky, trivialne lze napr. (napsal jsem to presne jak je tve zadani, ktere se mi ale zda hodne divne...)

-- existuje pouze radek s group_id = 0
select * from tabulka t
where group_id = 0
  and not exists ( select 0 from tabulka
                     where product_id = t.product_id
                       and group_id != 0 )
union all
-- existuje group_id = 2 i group_id = 0 a chci dvojku
select * from tabulka t
where group_id = 2
  and exists ( select 0 from tabulka
                 where product_id = t.product_id
                   and group_id = 0 )

nebo by sel pouzit outer join sam na sebe. Jsou i dalsi reseni, zalezi na tom co presne potrebujes, jestli te trapi vykon apod. Nejefektivnejsi casto byva spojeni s proceduralnim zpracovanim, pokud prichazi z hlediska aplikace v uvahu.
17.9.2012 14:57 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
Rozbalit Rozbalit vše Re: MySQL - podmínka pro sloupec
Ono jde o to, že daná cena může být pro group_id=0 - všechny uživatele, nebo pro group_id=x, kde x je skupina daného uživatele. A když je cena pro všechny uživatele bez ohledu na skupinu stejná, tak se používá group_id=0, jinak group_id=x. Takže potřebuju právě získat nejprve ceny pro group_id=x a když pro group_id=x není, tak pak výchozí cenu pro group_id=0.
17.9.2012 15:29 kuka
Rozbalit Rozbalit vše Re: MySQL - podmínka pro sloupec
No ja bych to nepitval, asi vis sam nejlip, co potrebujes. V otazce to podle mne pises trochu jinak ("bude jenom group_id=0"), takze si pripadne musis upravit podminku v prvnim dotazu. Rovnez podminka ve druhem dotazu vychazi ze zadani ("s group_id=0, tak i s group_id=2"), pokud je existence radku pro group_id=0 vzdy zarucena, tak tam podminka samozrejme nemusi vubec byt.
17.9.2012 15:48 Kit
Rozbalit Rozbalit vše Re: MySQL - podmínka pro sloupec
Kdybys dokázal specifikovat problém, tak bys možná na to i sám přišel. Takto jenom věštíme. Má mít group_id nějakou konkrétní hodnotu a v případě absence se má použít group_id=0?
17.9.2012 12:56 Kit
Rozbalit Rozbalit vše Re: MySQL - podmínka pro sloupec
Odpovědět | | Sbalit | Link | Blokovat | Admin
Má to sice k dokonalosti daleko, ale mohlo by to fungovat:
SELECT * FROM
   (SELECT * FROM tab ORDER BY group_id DESC) AS tab2
   GROUP BY product_id;
17.9.2012 23:20 Jirka
Rozbalit Rozbalit vše Re: MySQL - podmínka pro sloupec
Odpovědět | | Sbalit | Link | Blokovat | Admin
SELECT
  COALESCE(t2.id, t1.id),
  t1.product_id,
  COALESCE(t2.group_id, t1.group_id),
  COALESCE(t2.price, t1.price)
FROM
  tab t1
  LEFT JOIN tab t2 ON (t1.product_id=t2.product_id AND t2.group_id=2)
WHERE
  t1.group_id = 0;
18.9.2012 00:20 l0gik | skóre: 22
Rozbalit Rozbalit vše Re: MySQL - podmínka pro sloupec
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jednoduché - prostě chceš řádky s group_id 2 a takové s groupid 0, ke kterým neexistuje groupid 2...
SELECT * FROM tabulka WHERE 
group_id  = 2 OR 
(group_id = 0 AND product_id NOT IN (SELECT product_id FROM tabulka WHERE group_id = 2))
Pokud bys chtěl řádek s nejvyšším groupid (obecnější řešení), tak

SELECT * FROM TABULKA WHERE (product_id, group_id) IN 
(SELECT product_id , MAX(group_id) FROM tabulka GROUP BY product_id)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.