Autor Zpráva
jannek
Profil
Ahoj všem, doufám, že mi pomůžete. Řeším takový problém, který se mi nedaří rozseknout.

Mám DB pohled, ze kterého potřebuji vytáhnout jenom ty záznamy, které odpovídají zvolené sadě hodnot. Data pohledu vypadají přibližně takto (vynechávám nepotřebné sloupce):

| id | name   | from | to
| 1  | John   | A    | B
| 2  | Jack   | A    | B
| 2  | Jack   | B    | A
| 2  | Jack   | B    | A
| 2  | Jack   | B    | A
| 2  | Jack   | C    | D
| 3  | Mike   | C    | D
| 3  | Mike   | C    | D
| 3  | Mike   | C    | B
...

A potřebuji vytáhnout záznamy (duplicitní řádky slučuji pomocí GROUP BY), kde hodnoty ve sloupcích from a to odpovídají dvojicím (A, B) a (C, D), tj. výsledkem by měl být jeden řádek s ID 2.

Samotné řádky from a to v resultu nepotřebuji, ale potřebuji podle nich vyfiltrovat data. Došel jsem k příkazu:

SELECT id, name FROM view WHERE (from = A AND to = B) OR (from = C AND to = D) GROUP BY id, name

Ale to mi zahrne do výsledku i řádky s ID 1 a 3. A nevím pomocí čeho ty nechtěné řádky vyhodit pryč.

Zkoušel jsem různě googlit, ale k ničemu jsem se nedopracoval.

Díky všem.

PS. název tématu asi není zrovna vypovídající, ale lepší jsem nevymyslel.
Kajman
Profil
Přidejte na konec
HAVING count(distinct ("from","to"))=2
jannek
Profil
Děkuju mnohokrát. Vypadá, že to funguje.
jannek
Profil
Omlouvám se, že vytahuji toto starší téma, ale příjde mi to lepší než zakládat nové.

Potřebuji řešení uvedené výše upravit tak, aby zvládalo i neúplné rozsahy, tj. místo (A, B) a (C, D), zvládlo i (A, B) a (C, -) - aby zkrátka zahrnulo všechny uživatele, kteří mají dvojici (A, B) a zároveň C s libovolnou další hodnotou.

Mělo by to zvládat i kombinace typu (-, B) a (C, -), nebo jen samotný (-, B).

Bohužel se mi nedaří dobrat správného výsledku, zkoušel jsem SQL různě upravovat, sestavovat ho podmíněně v PHP apod.

Věděl by někdo? Díky.
Kajman
Profil
Asi bych rozdělil dotaz až na tři poddotazy, kdy se hledají páry, jen from nebo jen to. A to celé ještě zgroupovat a ošetřit, že se našlo ve všech poddotazech.

Pro (A, B) a (C, -) tedy něco jako
select id, name
from   ((SELECT id, name, 'oboje' druh_hledani
         FROM   view
         WHERE  (from = A AND to = B)
         GROUP  BY id, name
         HAVING count(distinct "from", "to")) = 1)
        union all
        (SELECT id, name, 'jenfrom' druh_hledani
         FROM   view
         WHERE  (from = C)
         GROUP  BY id, name
         HAVING count(distinct "from")) = 1)
         ) x
group  by id, name
having count(*) = 2 -- dva druhy hledani
tiso
Profil
jannek: nerozumiem čo presne chceš dosiahnuť. Vyzerá to na GROUP_CONCAT, ale radšej lepšie popíš čo chceš a pridaj aj vzorové dáta.

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: