Vložený select a přechod z mysql na mariadb pro výpis ze smf2 – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vložený select a přechod z mysql na mariadb pro výpis ze smf2 – MySQL – Fórum – Programujte.comVložený select a přechod z mysql na mariadb pro výpis ze smf2 – MySQL – Fórum – Programujte.com

 

VelkyBubak0
Newbie
20. 1. 2016   #1
-
0
-

v mysql jsme pro výpis nejnovějších příspěvků z různých témat (mimo moderátorských) používali SQL příkaz: 

select * from (select * from smf2_messages order by poster_time desc) as rows where id_board!=27 group by id_topic order by poster_time desc limit 10 

po přechodu na mariadb 10.1.10 již teto příkaz nevrací očekávané výsledky
zkoušel jsem různé variace příkazů a přijde mi že například tyto výrazy vrací shodné výsledky: 

select * from smf2_messages inner join (select distinct id_topic from smf2_messages where id_board!=27 order by poster_time desc) as rows on rows.id_topic=smf2_messages.id_topic order by poster_time desc limit 10
select * from smf2_messages  where id_board!=27 order by poster_time desc limit 10

přestože bych myslel že když 

select distinct id_topic from smf2_messages where id_board!=27 order by poster_time desc


vrátí očekávaný výsledek (neopakující se id_topic), měl by inner join fungovat - nicméně výsledkem jsou záznamy s opakujícími se id_topic

Nahlásit jako SPAM
IP: 94.113.138.–
Kit+15
Guru
20. 1. 2016   #2
-
0
-

#1 VelkyBubak
V prvním zápisu je chybně klauzule GROUP BY. MySQL to sežere (a v podstatě vrací nesmysly), ale ostatní databáze se vztekají.

Pokud chceš regulérně používat GROUP BY, musíš v každém sloupečku pro každý řádek zajistit jedinečnost hodnoty nějakou agregací.

Klauzuli WHERE je dobré umístit dovnitř závorky, bude to o něco rychlehší,

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:fc63:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
VelkyBubak0
Newbie
23. 1. 2016   #3
-
0
-

#2 Kit
Hm, díky. Myslíš jako že se vpodstatě vybírá náhodný záznam do každého sloupce?

PS: Zajistit ve fóru jedinečnost každého sloupce (včetně např. textu a nadpisu) je minimálně nepraktické ... a téměř nemožné - což by znamenalo nepoužívat na výpis group by -> napadá tě kde je chyba v tom druhém?

.

Nahlásit jako SPAM
IP: 94.113.138.–
Kit+15
Guru
23. 1. 2016   #4
-
0
-

#3 VelkyBubak
Náhodný v tom smyslu, že vezme první vhodný záznam, na který narazí, což nemusí být první podle ID. Pořadí záznamů v relační databázi obecně není definováno.

GROUP BY se běžně používá tak, že seznam prezentovaných sloupců, které neobsahují agregaci, se vypíše v klauzuli GROUP BY. Hvězdička zde nemá uplatnění.

Tuším, že posledně jsem podobný případ řešil přes podmínku WHERE topic_id IN (SELECT ... , ale nyní si neuvědomuji, jestli jsem to z důvodu výkonu nepředělal zase na JOIN. Na takové záležitosti se už občas vyplatí použití EXPLAIN, aby si vývojář uvědomil, jak to databáze řeší.

JOIN funguje jinak, než sis myslel ve 2. příkladu.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

Podobná vlákna

MySQL - SELECT — založil Harvy

Mysql select where — založil dudo1904

Select z MySql — založil jirka

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý