Autor Zpráva
JardaB
Profil
Zdravím,

mám trochu zatemněno a potřeboval bych malinko nakopnout. Mám tabulku 'vr3_bonusy_klient' - sloupce 'id', 'id_klient', 'id_bonus' - jedná se mi o sloupec id_bonus, kde je seznam všech bonusů klienta, přičemž jich může být více stejných.

Potřebuji dotazem vytáhnout první tři bonusy klienta, znám 3 čísla id_bunus. Může jít jednak o stejná čísla, nebo rozdílná. Šlo by to jedním dotazem?

Struktura dotazu je cca následující, kdy je logicky ta podmínka nesmyslná...

SELECT a.id, a.id_bonus, b.vaha 
                                 FROM vr3_bonusy_klient a
                                 JOIN vr3_bonusy b ON a.id_bonus = b.id
                                 WHERE a.id_klient = $klient[id] AND a.id_revir = 0 AND (a.id_bonus = $_GET[bonus_1] OR a.id_bonus = $_GET[bonus_2] OR a.id_bonus = $_GET[bonus_3] )  
                                 ORDER BY b.vaha DESC 
                                 LIMIT 3
Kajman
Profil
JardaB:
kdy je logicky ta podmínka nesmyslná

Co se Vám na podmínce zdá nesmyslného?
JardaB
Profil
Kajman:
Co se Vám na podmínce zdá nesmyslného?

Potřebuji dostat a.id u např. id_bonus 6 a 7 a 8. Nikoliv 6 nebo 7 nebo 8. Když budu mít v tabulce po sobě jdoucí id_bonus stejného čísla, tak s touto podmínkou dostanu předpokládám právě tyto záznamy. Nikoliv tedy 6 a 7 a 8 ale např. 6, 6, 8 nebo 6, 8, 8 atd.
Kajman
Profil
např.
(select .... where a.id_bonus = 6 ... order by a.id limit 1)
union all
(select .... where a.id_bonus = 7 ... order by a.id limit 1)
union all
(select .... where a.id_bonus = 8 ... order by a.id limit 1)


nebo do toho Vašeho dotazu přidáte
group by a.id_bonus, b.vaha
a a.id obalíte funkcí min

A v každém případě správně escapujte data vkládaná do sql příkazů. To, co sem posíláte, vypadá hrozivě!
JardaB
Profil
Kajman:
nebo do toho Vašeho dotazu přidáte
group by a.id_bonus, b.vaha

S tímto pokud budu hledat např. 7, 7, 7 dostanu jen jeden záznam místo třech. Potřebuji nutně k dispozici a.id od všech třech


Kajman:
(select .... where a.id_bonus = 6 ... order by a.id limit 1)
union all
(select .... where a.id_bonus = 7 ... order by a.id limit 1)
union all
(select .... where a.id_bonus = 8 ... order by a.id limit 1)

u tohoto dostanu při zadání 7, 7, 7 zase 3x stejná a.id
Kajman
Profil
Unionem můžete spojit jen jedinečná čísla v podmínce a v limitu použijete četnost toho čísla.

Tedy pro 7,7,7 vygenerovat
select .... where a.id_bonus = 7 ... order by a.id limit 3

pro 7,7,8
(select .... where a.id_bonus = 7 ... order by a.id limit 2)
union all
(select .... where a.id_bonus = 8 ... order by a.id limit 1)

Nebo pokud bude záležet na pořadí a nebudou všechna čísla stejná, přidáte si k limitu i offset, kde bude pořadí hledané hodnoty snížené o jedna. Tedy pro 7,6,7
(select .... where a.id_bonus = 7 ... order by a.id limit 0, 1)
union all
(select .... where a.id_bonus = 6 ... order by a.id limit 0, 1)
union all
(select .... where a.id_bonus = 7 ... order by a.id limit 1, 1)
JardaB
Profil
Ano tomuhle řešení bych i rozuměl. Nicméně zeptám se hloupě... Nebude lepší mít tři jednotlivé dotazy, kdy každý následující bude brát v úvahu předchozí získané a.id a vyloučí ho v podmínce WHERE?
Kajman
Profil
Zkuste si změřit rychlost obou variant a uvidíte.
JardaB
Profil
Kajman:
Zkuste si změřit rychlost obou variant a uvidíte.

Vyzkouším, děkuji...

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:

0