Portál AbcLinuxu, 27. října 2025 00:56
SELECT days_of_stay AS days,
accommodation_discounts.id AS id_discount,
accommodation_discounts.id_room_discounted
FROM accommodation_discounts
LEFT JOIN accommodation_discounts_rules_longer_stay
ON accommodation_discounts_rules_longer_stay.id_discount = accommodation_discounts.id
WHERE accommodation_discounts.discount_type = 'longer_stay'
AND accommodation_discounts.start_date < '2010-08-31'
AND accommodation_discounts.end_date >= '2010-08-26'
AND accommodation_discounts_rules_longer_stay.days_of_stay <= '6'
AND id_room_discounted = 105;
+------+-------------+--------------------+
| days | id_discount | id_room_discounted |
+------+-------------+--------------------+
| 4 | 353 | 105 |
| 5 | 354 | 105 |
| 4 | 355 | 105 |
+------+-------------+--------------------+
To je pro nejaky dany pokoj a z tohoto ja potrebuju vybrat tu hodnotu, kde je nejvyssi days, tzn radek
| 5 | 354 | 105 |
Ovsem, kdyz pouziju MAX(days_of_stay), tak to selectne:
+------+-------------+--------------------+ | days | id_discount | id_room_discounted | +------+-------------+--------------------+ | 5 | 353 | 105 | +------+-------------+--------------------+A uz neresi zavislost s id_discount. Takze jak to vyresit, jeste podotknu, ze finalni dotaz se groupuje podle id_room_discounted, tedy musim s tim pocitat. Takze neco jako:
SELECT MAX(days_of_stay) AS days,
accommodation_discounts.id AS id_discount,
accommodation_discounts.id_room_discounted
FROM accommodation_discounts
LEFT JOIN accommodation_discounts_rules_longer_stay
ON accommodation_discounts_rules_longer_stay.id_discount = accommodation_discounts.id
WHERE accommodation_discounts.discount_type = 'longer_stay'
AND accommodation_discounts.start_date < '2010-08-31'
AND accommodation_discounts.end_date >= '2010-08-26'
AND accommodation_discounts_rules_longer_stay.days_of_stay <= '6'
GROUP BY id_room_discounted
ovsem tak, aby to vybiralo data k MAX hodnote.
Nejake napady?
Řešení dotazu:
MAX()) vrátí určitou hodnotu ze sady hodnot – ale pouze tu hodnotu, neomezí výsledek dotazu na řádek, kde se ta hodnota nachází. Pokud použijete agregační funkci v části SELECT ve standardním SQL, můžete tedy v části SELECT použít jen agregační funkce a nebo sloupce uvedené v GROUP BY. MySQL tohle „omezení“ nemá a dělá GROUP BY automaticky, pokud však nemají všechny sloupce ve skupně stejnou hodnotu, vybere do výsledku některou z hodnot náhodně.
Ve vašem případě tedy zřejmě musíte použít vnořený dotaz – vnořeným dotazem zjistit tu největší hodnotu, a vnějším dotazem si pak vytáhnout řádek, který tuhle největší hodotu obsahuje.
SELECT
days,
id_discount,
id_room_discounted
FROM (
SELECT days_of_stay AS days,
accommodation_discounts.id AS id_discount,
accommodation_discounts.id_room_discounted
FROM accommodation_discounts
LEFT JOIN accommodation_discounts_rules_longer_stay
ON accommodation_discounts_rules_longer_stay.id_discount = accommodation_discounts.id
WHERE accommodation_discounts.discount_type = 'longer_stay'
AND accommodation_discounts.start_date < '2010-08-31'
AND accommodation_discounts.end_date >= '2010-08-26'
AND accommodation_discounts_rules_longer_stay.days_of_stay <= '6'
AND id_room_discounted = 105
ORDER BY days DESC
)
WHERE ROWNUM = 1;
Jinak nenapsal jsi pro jakou db to resis, tohle je pro Oracle.. Pokud tam mas neco jinyho tak asi bude treba zmenit tu podminku dole na nejaky LIMIT..
id_room_discounted.
Oracle to IMHO není, tam by se dalo řešit pomocí analytických funkcí. Pěkný úvod je například zde - http://www.dbsvet.cz/view.php?cisloclanku=2006071901
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.