Forum » Programiranje » Kako napisat SQL query?
Kako napisat SQL query?
HotBurek ::
Dobro jutro.
Imam sledečo situacijo. Rabim izpisat po en record za vsako grupo (v tem primeru base_url_id, ki pa je trenutno res samo en).
A težavo imam, ko uporabim order by. Rad bi, da mi razvrsti po stolpcu order_int (naraščajoče) in id (naraščajoče).
Se pravi, v spodnjem primeru bi moral vrnit record, ki ima id=1. Ta ima najmanjši order_int (0), ter najmanjši id (1). "Nižje" ne gre. A ne dela tako. Vrne row id=0.
Tole je trenutni poizkus:
Tabela:
Imam sledečo situacijo. Rabim izpisat po en record za vsako grupo (v tem primeru base_url_id, ki pa je trenutno res samo en).
A težavo imam, ko uporabim order by. Rad bi, da mi razvrsti po stolpcu order_int (naraščajoče) in id (naraščajoče).
Se pravi, v spodnjem primeru bi moral vrnit record, ki ima id=1. Ta ima najmanjši order_int (0), ter najmanjši id (1). "Nižje" ne gre. A ne dela tako. Vrne row id=0.
Tole je trenutni poizkus:
SELECT `id`, `base_url_id`, `order_int` FROM `page_url` GROUP BY `base_url_id` ORDER BY `schema_int` ASC, `id` ASC;
Tabela:
id|base_url_id|order_int| --+-----------+---------+ 0| 0| 2| 1| 0| 0| 2| 0| 0| 3| 0| 0| 4| 0| 0| 5| 0| 0| 6| 0| 0| 7| 0| 0| 8| 0| 0| 9| 0| 0|
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
chort ::
ORDER BY se izvaja na rezultatu, ki si ga pa predhodno z GROUP BY grupiral v (efektivno) eno grupo (ker so vse vrednosti base_url_id enake.
Preseneti me, da ti sploh kaj vrne za id in order_int, načeloma lahko izpisuješ le stolpce, na podlagi katerih grupiraš, in stolpce, na katerih na podlagi grupiranja nato izvajaš agregatne funkcije (SUM, AVG, COUNT, etc...).
Preseneti me, da ti sploh kaj vrne za id in order_int, načeloma lahko izpisuješ le stolpce, na podlagi katerih grupiraš, in stolpce, na katerih na podlagi grupiranja nato izvajaš agregatne funkcije (SUM, AVG, COUNT, etc...).
kuall ::
;with cte
(
row_num = row_number (order by burek parition by stolpec_za_grupiranje)
)
select * from cte where row_num = 1
ps pa pazi, da boš uporabil nujno nulle povsod lol
(
row_num = row_number (order by burek parition by stolpec_za_grupiranje)
)
select * from cte where row_num = 1
ps pa pazi, da boš uporabil nujno nulle povsod lol
Zgodovina sprememb…
- spremenilo: kuall ()
HotBurek ::
ORDER BY se izvaja na rezultatu, ki si ga pa predhodno z GROUP BY grupiral v (efektivno) eno grupo...
To je problem. Jst bi rabil prvo naredit order by, potem pa zgrupirat.
Evo, še ena tabela za lažjo predstavo.
Kako izpisat row id 1, 6 in 8? Vsak od teh ima najmanjši int (per base_url_id group) v stolpcu order_int, ter znotraj te skupine najmanjši id.
To je problem. Jst bi rabil prvo naredit order by, potem pa zgrupirat.
Evo, še ena tabela za lažjo predstavo.
Kako izpisat row id 1, 6 in 8? Vsak od teh ima najmanjši int (per base_url_id group) v stolpcu order_int, ter znotraj te skupine najmanjši id.
id|base_url_id|order_int| --+-----------+---------+ 0| 0| 2| 1| 0| 0| 2| 0| 1| 3| 0| 0| 4| 1| 1| 5| 1| 1| 6| 1| 0| 7| 1| 2| 8| 2| 1| 9| 2| 2|
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
HotBurek ::
Evo, zadevo sem nekako rešil. Vsaj testi tako kažejo.
Pomagal sem si s temle:
https://www.xaprb.com/blog/2006/12/07/h...
SELECT a.`id`, a.`base_url_id`, a.`order_int` FROM ( SELECT `base_url_id`, MIN(`order_int`) FROM `page_url` GROUP BY `base_url_id` ) AS b INNER JOIN `page_url` AS a ON a.`base_url_id` = b.`base_url_id` AND a.`order_int` = b.`order_int` GROUP BY `base_url_id` ORDER BY `id` ASC;
Pomagal sem si s temle:
https://www.xaprb.com/blog/2006/12/07/h...
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
bemfa ::
SELECT id, base_url_id, MIN(order_int) AS min_order_int FROM page_url GROUP BY base_url_id
Pa poskrbi, da bo only_full_group_by disabled: https://stackoverflow.com/questions/239...
HotBurek ::
Če tako naredim, dobim error:
Reason: SQL Error [1055] [42000]: (conn=32) 'database_0.page_url.id' isn't in GROUP BY
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
bemfa ::
Ker imaš only_full_group_by enablan. Lahko ga disablaš ali pa odstraniš id iz selecta, če ga ne potrebuješ. Sicer je treba čarat z subqueryem, kot si rešil že sam.
HotBurek ::
Dobro jutro.
Evo, zadeva se nadaljuje. Načeloma znam zadevo rešit proceduralno, a sem prepričan, da se da rešit z dobri SQL kverijem, katerega pa ne znam napisat.
Se pravi, proceduralno, kaj bi želel:
- Da kveri zlista samo tiste vrstice, kjer je status 0 ali 1
- Potem, da za vsako grupo (group_id) najde tistega, ki ima najnižji datum
- A pomembno je, da če obstaja vrstica z status 0 in višjim datumom, kot vrstica z statusom 1, da izbere tisto vrstico z statusom 0
Če so moje kalkulacije pravilne, bi tak kveri moral izpisat row id 5, 7, 11 in 17.
Primer tabele:
Pliz help...
Evo, zadeva se nadaljuje. Načeloma znam zadevo rešit proceduralno, a sem prepričan, da se da rešit z dobri SQL kverijem, katerega pa ne znam napisat.
Se pravi, proceduralno, kaj bi želel:
- Da kveri zlista samo tiste vrstice, kjer je status 0 ali 1
- Potem, da za vsako grupo (group_id) najde tistega, ki ima najnižji datum
- A pomembno je, da če obstaja vrstica z status 0 in višjim datumom, kot vrstica z statusom 1, da izbere tisto vrstico z statusom 0
Če so moje kalkulacije pravilne, bi tak kveri moral izpisat row id 5, 7, 11 in 17.
Primer tabele:
id|group_id|datetime_updated |name |status| --+--------+---------------------+------+------+ 0| 1|2022-03-12---23-14-30|test1 | 1| 1| 0|2022-03-12---23-14-30|test2 | 1| 2| 1|2022-03-12---23-14-20|test3 | 2| 3| 1|2022-03-12---23-14-38|test4 | 0| 4| 0|2022-03-12---23-14-36|test5 | 0| 5| 0|2022-03-12---23-14-34|test6 | 0| 6| 1|2022-03-12---23-14-32|test7 | 1| 7| 1|2022-03-12---23-14-36|test8 | 0| 8| 0|2022-03-12---23-14-37|test9 | 1| 9| 1|2022-03-12---23-14-38|test10| 1| 10| 2|2022-03-12---23-14-38|test11| 1| 11| 2|2022-03-12---23-14-36|test12| 1| 12| 2|2022-03-12---23-14-38|test13| 1| 13| 2|2022-03-12---23-14-38|test14| 1| 14| 2|2022-03-12---23-14-38|test15| 1| 15| 3|2022-03-12---23-14-38|test15| 0| 16| 3|2022-03-12---23-14-38|test15| 0| 17| 3|2022-03-12---23-14-32|test15| 0| 18| 3|2022-03-12---23-14-38|test15| 0| 19| 3|2022-03-12---23-14-38|test15| 0|
Pliz help...
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
5erson ::
Daj drugič create in insert stavke prosim...
MySQL:
Prvi:
Drugi:
MySQL:
Prvi:
WITH page_ranked as ( SELECT id, order_int, base_url_id, ROW_NUMBER() OVER (PARTITION BY order_int ORDER BY base_url_id) as nth FROM page_url ) SELECT * FROM page_ranked WHERE nth=1 ORDER BY id
Drugi:
WITH pr AS ( SELECT id, group_id, datetime_updated, name, status, ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY status, datetime_updated) as nth FROM page WHERE status IN (0, 1) ) SELECT * FROM pr WHERE nth=1
HotBurek ::
Hvala za pomoč.
Ta drugi primer mi je zelo pomagal, no, praktično vse.
Ker nisem ljubitelj uporabe WHIT, sem malo spremenil v INNER JOIN.
Potestiral, in dela.
Dbest.
Ta drugi primer mi je zelo pomagal, no, praktično vse.
Ker nisem ljubitelj uporabe WHIT, sem malo spremenil v INNER JOIN.
Potestiral, in dela.
Dbest.
SELECT t1.`id`, t1.`group_id`, t1.`datetime_updated`, t1.`name`, t1.`status` FROM `test1` AS t1 INNER JOIN ( SELECT `id`, ROW_NUMBER() OVER (PARTITION BY `group_id` ORDER BY `status`, `datetime_updated`) AS nth FROM `test1` WHERE `status` IN (0, 1) ) AS t2 ON t1.`id` = t2.`id` WHERE t2.nth = 1;
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
HotBurek ::
Dobro jutro.
Zgornji search dela ok, ampak je ena malenkost, ki je recimo moteča.
In to je, da pri sort order ne upošteva pozicijo najdene besede v tekstu. Se pravi, če ima tablea:
In če iščemo "bio" na sledeč način, bo vse tri rezultate enako ovrednotilo in razvrstilo glede na id (0, 1 , 2).
Bol kul bi bilo, da bi bil order (2, 1, 0), pač glede na to, kako daleč od začetka (levo proti desni) se iskani string nahaja.
Zgornji primer: https://www.tutorialspoint.com/sort-sea...
Kakšne so opcije, da bi rezultate iz prvega querija (IN NATURAL LANGUAGE MODE) sortiral glede na pozicijo besede v iskanem stringu, plus da bi to delalo za iskani niz, ki bi vseboval več besed (npr: "bio brokoli 500g")?
Zgornji search dela ok, ampak je ena malenkost, ki je recimo moteča.
In to je, da pri sort order ne upošteva pozicijo najdene besede v tekstu. Se pravi, če ima tablea:
id|name | --+----------------+ 0|juha brokoli bio| 1|brokoli bio juha| 2|bio juha brokolo|
In če iščemo "bio" na sledeč način, bo vse tri rezultate enako ovrednotilo in razvrstilo glede na id (0, 1 , 2).
SELECT `id`, `name`, MATCH(`name`) AGAINST('bio' IN BOOLEAN MODE) AS 'relevance' FROM `temp` WHERE MATCH(`name`) AGAINST('bio' IN NATURAL LANGUAGE MODE) ORDER BY MATCH(`name`) AGAINST('bio' IN NATURAL LANGUAGE MODE) DESC; id|name |relevance | --+----------------+------------------+ 0|juha brokoli bio|0.0000000018859283| 1|brokoli bio juha|0.0000000018859283| 2|bio juha brokolo|0.0000000018859283|
Bol kul bi bilo, da bi bil order (2, 1, 0), pač glede na to, kako daleč od začetka (levo proti desni) se iskani string nahaja.
SELECT `id`, `name`, LOCATE('bio', `name`) AS 'locate' FROM `temp` WHERE `name` LIKE CONCAT('%', 'bio', '%') ORDER BY LOCATE('bio', `name`) ASC; id|name |locate| --+----------------+------+ 2|bio juha brokolo| 1| 1|brokoli bio juha| 9| 0|juha brokoli bio| 14|
Zgornji primer: https://www.tutorialspoint.com/sort-sea...
Kakšne so opcije, da bi rezultate iz prvega querija (IN NATURAL LANGUAGE MODE) sortiral glede na pozicijo besede v iskanem stringu, plus da bi to delalo za iskani niz, ki bi vseboval več besed (npr: "bio brokoli 500g")?
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Kaj pomeni %uFFFC v URL-ju?Oddelek: Programiranje | 819 (564) | HotBurek |
» | [SQL] Pohitritev izpisaOddelek: Programiranje | 2968 (1867) | kuall |
» | SQL vprašanjeOddelek: Programiranje | 1124 (723) | MrStein |
» | MYSQL vprašanjeOddelek: Programiranje | 1810 (1425) | MrBrdo |
» | Malce zahtevnejši SQL stavek včasih narobe SELECT-aOddelek: Izdelava spletišč | 2156 (1825) | Brilko |