2017-02-02 11 views
0

ich innerhalb einer Unterabfrage mit einer group_concat Anweisung ein Problem mit:GROUP_CONCAT in subquery Ausbeuten unpredicable Ergebnisse

select group_concat(name separator " ")title,tmp.p_i 
from (
    select name,blog.db_blog_posts_title_words_evanhendler.p_i 
    from blog.db_blog_posts_title_words_evanhendler 
    join words.words_blog_posts_title 
    on blog.db_blog_posts_title_words_evanhendler.s_i=words.words_blog_posts_title.id 
    order by blog.db_blog_posts_title_words_evanhendler.id 
)tmp 
group by tmp.p_i 

liefert das gewünschte Ergebnis:

+-------------------+------+ 
| title    | p_i | 
+-------------------+------+ 
| This is the title | 1 | 
| This is the title | 2 | 
| This is the title | 3 | 
| This is the title | 4 | 
+-------------------+------+ 

jedoch:

select title from blog.db_blog_posts_title_evanhendler left join (
    select group_concat(name separator " ")title,tmp.p_i 
    from (
     select name,blog.db_blog_posts_title_words_evanhendler.p_i 
     from blog.db_blog_posts_title_words_evanhendler 
     join words.words_blog_posts_title 
     on blog.db_blog_posts_title_words_evanhendler.s_i=words.words_blog_posts_title.id 
     order by blog.db_blog_posts_title_words_evanhendler.id 
    )tmp 
    group by tmp.p_i 
)tmp 
on blog.db_blog_posts_title_evanhendler.id=tmp.p_i; 

Ausbeuten:

+-------------------+ 
| title    | 
+-------------------+ 
| is the title This | 
| This is the title | 
| This is the title | 
| This is the title | 
+-------------------+ 
+0

Sie benötigen eine Bestellung innerhalb von group_concat. Sie haben die ersten paar Male mit der Bestellung Glück gehabt, aber die zusätzliche Verbindung veranlasst die Maschine, sie in eine andere Reihenfolge zu bringen. So .... 'group_concat (Name ORDER BY Some_value_which_will_put_name_in_right_Order_For_you Trennzeichen" ")' [Docs] (https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat) – xQbert

+0

Versuchte das. Warte, ich bearbeite es, um die Originaltabellen anzuzeigen. –

+0

hatte es in der falschen Parameterreihenfolge, Sie benötigen die Reihenfolge vor dem Trennzeichen. – xQbert

Antwort

0

Sie benötigen einen optionalen Parameter ORDER BY innerhalb des group_concat. Sie haben die ersten paar Male mit der Bestellung Glück gehabt, aber die zusätzliche Verbindung veranlasst die Maschine, sie in eine andere Reihenfolge zu bringen. So ....

GROUP_CONCAT(name ORDER BY Some_field_or_Fields_which_will_put_name_in_right_Order_For_you 
SEPARATOR " ") 

Auszug aus Docs:

GROUP_CONCAT([DISTINCT] expr [,expr ...] 
      [ORDER BY {unsigned_integer | col_name | expr} 
       [ASC | DESC] [,col_name ...]] 
      [SEPARATOR str_val]) 

In MySQL können Sie die verketteten Werte Ausdruckskombinationen erhalten. Verwenden Sie die DISTINCT-Klausel, um doppelte Werte zu vermeiden. Verwenden Sie die ORDER BY-Klausel, um Werte im Ergebnis zu sortieren. Um in umgekehrter Reihenfolge zu sortieren, fügen Sie das DESC-Schlüsselwort (descending) dem Namen der Spalte hinzu, nach der Sie in der ORDER BY-Klausel sortieren. ...

Auch wenn Sie nichts zu bestellen haben, um die "Namen" in die richtige Reihenfolge zu bringen, dann haben Sie kein Glück. Da Bestellung ist sonst nicht garantiert!

+0

Ja, es gibt eine ID-Spalte in der tiefsten Unterabfrage. Es funktioniert alles jetzt. –