2017-03-16 1 views
1

ich eine MySQL-Abfrage wie folgt haben:Wie kann ich dies in einer Art und Weise neu schreiben, es bietet die gleiche Leistung

SELECT 
    bp.id, 
    COUNT(*) AS total 
FROM 
    blog_posts bp 
JOIN 
    tagged tg ON 
     tg.taggable_id = bp.id 
     AND tg.taggable_type = 'App\Storage\BlogPost' 
JOIN 
    tags t ON 
     t.id = tg.tag_id 
WHERE 
    bp.user_id = 1 
GROUP BY 
    t.id 
ORDER BY 
    total DESC, 
    t.count DESC 
LIMIT 
    3 

und ich habe einen Fehler:

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'example.bp.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Wie kann ich Schreiben Sie das so um, dass es die gleiche Ausgabe liefert?

ich in MySQL 5.7.17 mit Homestead Laravel arbeiten

Antwort

1

Jedes Mal, wenn Sie eine GROUP BY alles tun Sie Ihre SELECT und ORDER BY Klausel hinzufügen, muss in der GROUP BY Klausel sein, es sei denn Sie eine Aggregatfunktion verwenden wie MIN(), MAX(), SUM(), AVG(), etc.

In diesem Fall haben Sie t.count DESC in Ihrer Bestellung durch Klausel, Schreiben der Abfrage wie dies wird Ihnen das gewünschte Ergebnis liefern.

SELECT 
    id, 
    total 
FROM 
    (
     SELECT 
      bp.id, 
      COUNT(*) AS total, 
      MAX(t.count) count 
     FROM 
      blog_posts bp 
     JOIN 
      tagged tg ON 
       tg.taggable_id = bp.id 
       AND tg.taggable_type = 'App\Storage\BlogPost' 
     JOIN 
      tags t ON 
       t.id = tg.tag_id 
     WHERE 
      bp.user_id = 1 
     GROUP BY 
      bp.id, 
      t.id 
     LIMIT 
      3 
    ) a 
ORDER BY 
    total DESC, 
    `count` DESC 

Wenn Sie nicht egal, ob Zählung in Ihrem Endergebnis enthalten ist, dann können Sie dies tun

SELECT 
    bp.id, 
    COUNT(*) AS total, 
    MAX(t.count) count 
FROM 
    blog_posts bp 
JOIN 
    tagged tg ON 
     tg.taggable_id = bp.id 
     AND tg.taggable_type = 'App\Storage\BlogPost' 
JOIN 
    tags t ON 
     t.id = tg.tag_id 
WHERE 
    bp.user_id = 1 
GROUP BY 
    bp.id, 
    t.id 
ORDER BY 
    total DESC, 
    t.count DESC 
LIMIT 
    3 
+0

Ich habe versucht, alle Ihre Beispiel, aber immer noch bekam eine Fehlermeldung, 'Expression # 1 von SELECT-Liste ist nicht in GROUP BY-Klausel und enthält nicht aggregierten Spalte‚example.bp.id 'das funktional nicht von Spalten in der GROUP BY-Klausel abhängig ist; Das ist inkompatibel mit sql_mode = only_full_group_by' –

+0

oops Ich habe gerade festgestellt, dass Sie Gruppe auf t.id waren, nicht bp.id Ich werde die Abfragen aktualisieren. – Augwa

+0

Ah danke ^^ –

0

Ich bin ein wenig verwirrt auf zwei Punkte - was Sie zu ziehen versuchen, und wie Sie das gleiche Ergebnis gesetzt haben wollen (vorausgesetzt, Sie erhalten im Moment kein Ergebnis)

Die Verwirrung kommt darin, dass Sie auf bp.id berichten, aber auf t.id gruppieren. Die Auswahl und die Gruppe sollten in diesem Fall übereinstimmen. Wählen Sie entweder "t.id" oder "group" auf "bp.id" oder wählen Sie "BOTH" aus und gruppieren Sie sie - je nach Berichtsanforderungen.

Obwohl ich glaube, dass MySQL die Optimierung durchführt, ist es besser, einen count (1) zu verwenden, es sei denn, Sie versuchen speziell zu vermeiden, eine gekeyte Null-Datenzeile zu zählen.

Hoffnung, dass hilft - John

+0

Was ich versuche zu erhalten, ist die Top 3 Tags von einem bestimmten Autor (user_id) verwendet, um die am häufigsten verwendeten Tags anzuzeigen. Was ich am Ende erwarte, ist nur eine Liste von Blog Pots (bp.id), ich brauche den Counter nicht wirklich, wenn das die Abfrage erschweren würde ... aber wenn es eine Kombination von beiden wäre, wäre das auch großartig. Ich kann das mit 5.6 machen, aber ich konnte in 5.7 keinen Weg finden. –

Verwandte Themen