Front-end Front-end
Probíhá výprodej HTML, JavaScript a Bootstrap. Slevy až 80 %
Vyšlehej si extra vědomosti! Až 100% bodů na prémiový obsah zdarma! Více zde

Diskuze: spravne poradi po grupovani

Aktivity (1)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5. dubna 9:39
SELECT GROUP_CONCAT(CONCAT(`x`.`jmeno`, ' - ', `x`.`prijmeni`) SEPARATOR ', ') AS `participant_list`
FROM (
  SELECT DISTINCT `a`.`idform`, `b`.`jmeno`, `b`.`prijmeni`
  FROM     `s_form_participant` `a`
              LEFT JOIN `s_participant` `b` ON `b`.`idparticipant`=`a`.`idparticipant`
  WHERE    `a`.`idform`=%s
  ORDER BY `b`.`prijmeni` DESC, `b`.`jmeno` ASC
  ) AS x
GROUP BY `x`.`idform`

        $query    = "

";
        $sql_row = $this->SQL->selectOne($query, array($id_form));
        var_dump($sql_row);

Zkusil jsem: Ten vnitrni dotaz vrati jmena (pokusna) v poradi

63, Tomas, Cerny
63, Petr, Zavodnik

Ale ten group mi poradi uplne zmeni.

array (size=1)
  'participant_list' => string 'Petr - Zavodnik, Tomas - Cerny' (length=30)

Netusim proc. Grupovani moc neovladam, ale logicky by mel preci uprednostovat poradi v jakem dostane data, ne?

Chci docílit: Chtel bych mit jmena serazena podle abecedy.

Editováno 5. dubna 9:40
 
Odpovědět 5. dubna 9:39
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5. dubna 9:53

Vim, vim, v dotazu mam DESC. Ale to s tim nesouvisi. At napisi, co napisi, tak se poradi nezmeni.
Ted jsem nasel, ze u mariadb je nejaky problem, ktery se da resit pomoci LIMIT 1844674407370­9551615

As I am not allowed to comment on user1908688's answer, here a hint for MariaDB users:

SELECT *
FROM (
     SELECT *
     ORDER BY date ASC, time ASC
     LIMIT 18446744073709551615
     ) AS sub
GROUP BY sub.name

Po pridani mi to na localhostu zacalo menit poradi. Nicneme presne opacne :) Po odebrani ASC DESC stale funguje. To je divny bug.

 
Nahoru Odpovědět 5. dubna 9:53
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5. dubna 9:55

jenom doplnim...

        $query    = "
-- SELECT GROUP_CONCAT(CONCAT(`x`.`jmeno`, ' - ', `x`.`prijmeni`) SEPARATOR ', ') AS `participant_list`
-- FROM (
  SELECT DISTINCT `a`.`idform`, `b`.`jmeno`, `b`.`prijmeni`
  FROM     `s_form_participant` `a`
              LEFT JOIN `s_participant` `b` ON `b`.`idparticipant`=`a`.`idparticipant`
  WHERE    `a`.`idform`=%s
  ORDER BY `b`.`prijmeni` ASC, `b`.`jmeno` ASC
LIMIT 18446744073709551615
--   ) AS x
-- GROUP BY `x`.`idform`
";
//`b`.`prijmeni` SEPARATOR ', ') AS `out`
        $sql_row = $this->SQL->selectAll($query, array($id_form));
var_dump($sql_row);

array (size=2)
  0 =>
    array (size=3)
      'idform' => string '63' (length=2)
      'jmeno' => string 'Tomas' (length=5)
      'prijmeni' => string 'Cerny' (length=5)
  1 =>
    array (size=3)
      'idform' => string '63' (length=2)
      'jmeno' => string 'Petr' (length=4)
      'prijmeni' => string 'Zavodnik' (length=8)

a bez poznamek -- to vyhodi toto

array (size=1)
  0 =>
    array (size=1)
      'participant_list' => string 'Petr - Zavodnik, Tomas - Cerny' (length=30)
Editováno 5. dubna 9:55
 
Nahoru Odpovědět 5. dubna 9:55
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5. dubna 10:04

A ted ten samy dotaz funguje pro zmenu. Vubec nevim proc. Takze netusim, co to bude delat realne na serveru :) Zatim to asi nebudu resit

Jeste mne napada, ze nekde nekdo rikal, ze sloupec, ktery pouzivam pro GROUP bych mel mit i v SELECT. Tak to tam zkusim pridat a budu doufat, ze to bylo tim :)

 
Nahoru Odpovědět 5. dubna 10:04
Avatar
Odpovídá na Peter Mlich
Tomáš Novotný:5. dubna 10:04

Také jsem to jednou řešil... pokud i pamatuji správně, myslím, že to souviselo s optimalizací vykonávaní toho dotazu. Pokud ve vloženém/ vnitřním dotazu s ORDER BY není LIMIT, tak je tento ORDER BY ve vnějším dotazu ignorován. Je to specifické pro MariaDB.

Editováno 5. dubna 10:07
Nahoru Odpovědět 5. dubna 10:04
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
plelovsky
Člen
Avatar
plelovsky:5. dubna 13:35

Třídit ve vnitřním selectu nemá smysl. Obecně pořadí záznamů v selectu není garantované bez použití ORDER BY.
Obal ten vnější select ještě jedním s tříděním výsledků.

Editováno 5. dubna 13:35
 
Nahoru Odpovědět  +1 5. dubna 13:35
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na plelovsky
Peter Mlich:5. dubna 15:11

No, ja zkousel cely ten order presunout na konec. Ale vysledek byl stejny, prave.
ORDER BY x.prijmeni ASC, x.jmeno ASC

Pak to zacalo fungovat, ikdyz jsem ten limit smazal. At uz jsem mel ORDER pak kdekoliv. Ja to proste asi nechapu. Kdyby to bylo puvodni mysql a netlacili mi tam jakesi mariadb, tak by to normalne fungovalo. Ale, kdo vi, mozna v tom dotazu mam nejakou skrytou zaludnost.
Uplne idealni by bylo, kdyby se mi to podarilo propojit na SELECT sloupce FROM s_idform , idform=idform. Ale je patek a uz se mi nechce premyslet. A tech zaznamu bude tak do 300, at se sql server taky trochu zapoti pri exportu :)

 
Nahoru Odpovědět 5. dubna 15:11
Avatar
plelovsky
Člen
Avatar
plelovsky:5. dubna 15:33
SELECT * FROM (
    SELECT GROUP_CONCAT(CONCAT(`x`.`jmeno`, ' - ', `x`.`prijmeni`) SEPARATOR ', ') AS `participant_list`
    FROM (
      SELECT DISTINCT `a`.`idform`, `b`.`jmeno`, `b`.`prijmeni`
      FROM     `s_form_participant` `a`
                  LEFT JOIN `s_participant` `b` ON `b`.`idparticipant`=`a`.`idparticipant`
      WHERE    `a`.`idform`=%s
      ) AS x
    GROUP BY `x`.`idform`
) AS q
ORDER BY `participant_list`
 
Nahoru Odpovědět 5. dubna 15:33
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5. dubna 16:02

Aha, takhle mysleno. No, mozna vyzkousim, pokud nahlasi problem, se spatnym poradim jmen :) Ono, teoreticky jim je mozna jedno v jakem poradi to bude. Ale uvidime. Ale urcite dik.

 
Nahoru Odpovědět 5. dubna 16:02
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.