2016-11-21 3 views
4

Ich habe vier Tabellen in der Datenbank, d. H. Pakete, Fixtures, Deals und Fixtures Deals.Wie Verwenden von GroupBy in verschachtelter Abfrage in Laravel 5?

Hier sind die Tabellenstruktur Details:

Packages: id, title 
Fixtures: id, package_id, name 
Deals: id, discound, description 
Fixtures_Deal: id, fixture_id, deal_id, price 

Ich brauche zusammen mit dem Mindest Deal Preis der Pakete Liste zu erhalten, die für jedes Paket in jedem Gerät bietet.

Hier ist die MySQL-Abfrage, die ich in phpMyAdmin oder SQLYog ausführen, und es funktioniert perfekt, aber in Laravel gibt es mir "p.title" ist nicht in GROUP BY "-Fehler.

SELECT 
    p.title AS package_title,  
    tbl_min_value.min_price AS min_price 
FROM 
    (SELECT 
    fixture_id, 
    MIN(deal_price) AS min_price 
    FROM 
    fixture_deal 
    GROUP BY fixture_id) AS tbl_min_value 
    JOIN fixtures AS f 
    ON f.id = tbl_min_value.fixture_id 
    RIGHT JOIN packages AS p 
    ON f.package_id = p.id 
GROUP BY p.id 

By the way, ich versuche, es zu erreichen, indem die folgende Methode in Modell:

return DB::statement('SELECT 
     p.title AS package_title,  
     tbl_min_value.min_price AS min_price 
    FROM 
     (SELECT 
     fixture_id, 
     MIN(deal_price) AS min_price 
     FROM 
     fixture_deal 
     GROUP BY fixture_id) AS tbl_min_value 
     JOIN fixtures AS f 
     ON f.id = tbl_min_value.fixture_id 
     RIGHT JOIN packages AS p 
     ON f.package_id = p.id 
    GROUP BY p.id'); 
+0

haben Sie versucht, es auf andere Weise auszuführen, wie '$ pdo = DB :: connection() -> getPdo();' und feuern Sie es direkt – Mruf

+0

Nein, ich habe es nicht versucht. Können Sie bitte erläutern, wie kann ich das tun? Sollte ich einen solchen Code schreiben ?: DB :: connection() -> getPdo ('Query'); –

+0

https://codeshare.io/29QA72 – Mruf

Antwort

2

ich einen anderen Weg, um mapWithKeys Methode unter Verwendung von Eloquent Collection gefunden.

Also habe ich die Daten von zwei Abfragen getrennt abgerufen und beide Sammlungen mit Schlüsseln in einem Sammelobjekt zugeordnet.

Beispielcode:

$packages = Package::getPackages(); 

$deal_min_price = Deal::getMinimumPrice(); 

$packages_with_price = $packages->mapWithKeys(function ($packages) use ($deal_min_price) { 
    return $packages['price'] => $deal_min_price['min_price']; 
}); 

Sie können entweder foreach Schleife innerhalb des mapWithKey's closure verwenden.

1

Der Fehler, den Sie bekommen, weil MySQL 5.7 mehr kompatibel mit SQL99 bewegt werden. Sie können ein wenig darüber lesen here, aber es beinhaltet eine SQL-Modus-Einstellung namens ONLY_FULL_GROUP_BY, die sicherstellt, dass alle nicht aggregierten Spalten innerhalb der GROUP BY ausgewählt sind. Was bedeutet das für Ihre Situation?

Nun, müssen Sie einfach p.title und tbl_min_value.min_price der Gruppierung hinzuzufügen, um es richtig zu arbeiten, da sie nicht aggregiert werden:

GROUP BY p.id, p.title, tbl_min_value.min_price 

Sie werden sich vielleicht fragen: „Warum in aller Welt sollte sie das tun? ". Nun, mit GROUP BY, bevor es einfach war, versehentlich Daten "zu reduzieren", wo eine Zeile mehr als einen möglichen Wert hatte, den es anzeigen konnte, so zeigte es nur den ersten. Auf diese Weise können Sie herausfinden, was Sie mit einer Aggregatfunktion wie MIN() oder MAX() anzeigen möchten, oder Sie können sie der Gruppierung hinzufügen, um anzugeben, dass sie getrennt sein sollen.

Wenn Sie nicht die Art, wie das funktioniert, können Sie es vorübergehend deaktivieren, indem Sie diese:

# Run this query and copy the values 
SELECT @@sql_mode; 

# Remove "ONLY_FULL_GROUP_BY" and paste it in here where the XXX is 
SET sql_mode = 'XXX'; 

Oder Sie können diese Änderung durch die Bearbeitung Ihrer my.cnf Datei unter dem [mysqld] Abschnitt wie diese dauerhaft machen,

[mysqld] 
sql_mode=XXX 
+0

Sobald ich andere aggregierte Spalten in Group By hinzugefügt habe, gibt es mir keine passenden Ergebnisse, dh es gibt Ergebnisse mit doppelten IDs aus, das ist das Problem. Zusätzlich habe ich versucht, den SQL-Modus zu ändern, aber es hat nicht funktioniert. –

+0

Das liegt daran, dass Sie mehr als eine Zeile mit derselben ID als Ergebnis Ihrer Joins haben. Versuchen Sie 'GROUP_CONCAT (p.title)' und/oder 'GROUP_CONCAT (tbl_min_value.min_price)', um zu sehen, was ich meine –

+0

Ich fragte mich auch, dass die gleiche Abfrage mit einer Gruppe von Spalte funktioniert gut in phpMyAdmn oder SQLYog, aber es tut nicht t Arbeit in Laravel 5.3. Das könnte ein Problem mit Laravel sein ... Nicht sicher ..! –

0

Es ist seltsam, dass eine SQL-Abfrage in phpMyAdmin funktioniert prima, aber das gleiche funktioniert nicht in Laravel 5.3: wobei XXX für die Ausgabe von SELECT @@sql_mode; minus der ONLY_FULL_GROUP_BY Teil ist. Würden Sie die db-Struktur mit Beispieldaten veröffentlichen, also schauen wir uns das an?

BTW, habe ich versucht, folgende SQL und funktioniert gut in Laravel 5.2:

SELECT 
    p.title AS package_title,  
    tbl_min_value.min_price AS min_price 
FROM 
    (SELECT 
    fixture_id, 
    MIN(deal_price) AS min_price 
    FROM 
    fixtures_deal 
    GROUP BY fixture_id) AS tbl_min_value 
    JOIN fixtures AS f 
    ON f.id = tbl_min_value.fixture_id 
    RIGHT JOIN packages AS p 
    ON f.package_id = p.id 
GROUP BY p.id