2016-11-24 1 views
1

Chunk richtig ist Mein Problem ist, dass ich in jedem Moment die doppelten Einträge in Mel Spalte aus Zieltabelle erhalten muss.Wie man richtig eine Abfrage mit Unterabfrage in Laravel

Ich habe so viele Dinge versucht, diese Abfrage in Laravel zu übersetzen, konnte aber den Weg nicht finden:

select id 
from dest d, 
    (select mel from dest where stt = 0 group by mel having count(mel) > 1) sr 
where d.mel = sr.mel 

Ich habe versucht, eine Ansicht

create DEFINER = user view dest_doubles 

als select id zu erstellen aus dest d, (wählen mel aus dest wo stt = 0 gruppe durch mel mit zähl (mel)> 1) sr wo d.mel = sr.mel

Die select id from dest_doubles Abfrage dauert ewig, während

select id from dest d, (select mel from dest where stt = 0 group by 
mel having count(mel) > 1) sr where d.mel = sr.mel 

antwortet 3 Minuten

ich dies in Laravel Befehl versucht haben:

\DB::select(\DB::raw('dest.id')) 
         ->from(\DB::raw('dest, (select mel from dest where stt = 0 group by mel having count(mel) > 1) as sr')) 
         ->whereRaw('dest.mel = sr.mel') 
         ->chunk(10000, function ($doubles) { 

});

und konnte nicht ausgeführt werden:

[PDOException]
SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1064 Sie haben einen Fehler in der SQL-Syntax; Sie in die Bedienungsanleitung für die richtige Syntax verwendet in der Nähe von ‚dest.id‘ bei Linie 1

Also ich weiß nicht, wie zu Chunk eine Abfrage, die eine Unterabfrage in Laravel zu Ihrer MySQL-Server-Version entspricht enthält

Danke

+0

Ich sollte präzisieren, dass dest ist ein großer Tisch mit 8 Millionen Zeilen –

Antwort

0

für die Hilfe, ich bin kein Laravel Guru, aber Sie können Ihre ursprüngliche Abfrage als INNER JOIN zwischen dem Tisch und der Unterabfrage neu schreiben. Dies könnte mit Laravel einfacher sein.

SELECT id 
FROM dest d 
INNER JOIN 
(
    SELECT mel 
    FROM dest 
    WHERE stt = 0 
    GROUP BY mel 
    HAVING COUNT(*) > 1 
) AS sr 
    ON d.mel = sr.mel 
+0

Vielen Dank für Ihre Antwort! Ich habe versucht, direkt von MySQL vor der Umsetzung Ihrer Idee auszuführen, aber es ist ziemlich lang und nachhaltig .. Ich denke, weil es ein großer Tisch ist (ca. 8m Zeilen) –