Autor | Zpráva | ||
---|---|---|---|
JardaB Profil |
#1 · Zasláno: 3. 9. 2019, 20:08:45
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 |
#2 · Zasláno: 3. 9. 2019, 20:53:18
JardaB:
„kdy je logicky ta podmínka nesmyslná“ Co se Vám na podmínce zdá nesmyslného? |
||
JardaB Profil |
#3 · Zasláno: 3. 9. 2019, 21:46:02
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 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 |
#6 · Zasláno: 4. 9. 2019, 08:10:31
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 |
#7 · Zasláno: 4. 9. 2019, 08:21:56
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 |
#8 · Zasláno: 4. 9. 2019, 08:28:31
Zkuste si změřit rychlost obou variant a uvidíte.
|
||
JardaB Profil |
#9 · Zasláno: 4. 9. 2019, 08:31:13
Kajman:
„Zkuste si změřit rychlost obou variant a uvidíte.“ Vyzkouším, děkuji... |
||
Časová prodleva: 6 let
|
0