» »

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:
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

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...).

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

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.


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

Zgodovina sprememb…

  • spremenilo: HotBurek ()

kuall ::

zgleda, da me ima burek v skripti, da ne vidi mojih odgovorov. hehe snowflake.

HotBurek ::

Evo, zadevo sem nekako rešil. Vsaj testi tako kažejo.

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

leeon ::

z uporabo funkcije first_value bo poizvedba lepša in hitrejša

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

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:
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...:|:O:))
root@debian:/# iptraf-ng
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:
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. 8-)

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

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:

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

Zgodovina sprememb…

  • spremenilo: HotBurek ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Kaj pomeni %uFFFC v URL-ju?

Oddelek: Programiranje
5734 (479) HotBurek
»

[SQL] Pohitritev izpisa

Oddelek: Programiranje
252630 (1529) kuall
»

SQL vprašanje

Oddelek: Programiranje
81047 (646) MrStein
»

MYSQL vprašanje

Oddelek: Programiranje
131665 (1280) MrBrdo
»

Malce zahtevnejši SQL stavek včasih narobe SELECT-a

Oddelek: Izdelava spletišč
302030 (1699) Brilko

Več podobnih tem