2016-04-15 7 views
3

Ich muss Werte abrufen, die nicht in einer anderen Tabelle vorhanden sind. Ich arbeite mit Shares und Share_types Tabellen.Abfrage, um Werte abzurufen, die zwischen Tabellen nicht vorhanden sind

Zur Zeit habe ich dies mit PHP arbeiten, aber ich bin immer Schleifen über die 2.500 ~ Zeilen von Share_types und ich denke, es ist möglich, die Menge der Zeilen mit einer Abfrage zu lösen.

Der Benutzer zur Zeit durch diesen Prozess geht:

  1. die Art der Aktien wählen - Anual share
  2. das Jahr auswählen, die extrahiert werden - 2016
  3. -Code wird alle Aktien bis zum Jahr 2016 erzeugen das war noch nicht erzeugt. Das bedeutet, dass die Jahre von 2016 auch generiert werden, wenn sie nicht existieren.

Das heißt, meine PHP-Code wie folgt lautet:

// Retrieves always the 2,500~ rows 
$listOfShareTypes = "SELECT user_id, date_start FROM share_types WHERE type = 'Anual share'"; 

foreach($listOfShareTypes as $type) 
{ 
    // Now is where I validate if the share already exists 
    $hasShare = "SELECT COUNT(*) FROM shares WHERE the_year = $yearSelectedByUser, user_id = $type->user_id, share_type_id = $type->id"; 

    if($hasShare == TRUE) 
     continue; 
    else 
     // Create the share.. 
} 

Also in der Regel über Abfrage, um die Ergebnisse abzurufen, die in einer anderen Tabelle existiert nicht ich zwei select in einer Abfrage tun würde, aber nach ein paar Suchen zeigt es auf die Verwendung von LEFT JOIN. Jedoch habe ich keine Ahnung, wie dies zu erreichen, da ich an diesem Beispiel, das ich auf SQLFiddle erstellt mehrere Felder (user_id, share_type_id, Jahr etc.)

der Suche übereinstimmen müssen, sollte das Ergebnis sein:

(5, 3, 'Anual', '2015-06-28') 

Und mit diesem Ergebnis und da der Benutzer das Jahr 2016 ausgewählt habe, sollte ich (in PHP) von 2015 bis 2016 Schleife.

Antwort

2

Sie haben die falsche Spalte im join-Zustand verwendet. Die Tabellen sollten unter user_id verknüpft werden.

SQL Fiddle

SELECT stype.id, stype.user_id, stype.type, stype.date_start 
FROM share_types AS stype 
LEFT JOIN shares AS share ON share.user_id = stype.user_id 
WHERE share.share_type_id IS NULL 
+0

ich Ihre Antwort akzeptiert, aber jetzt stand ich ein anderes Problem, wenn die ‚2017‘ Benutzer wählt es sollten alle Zeilen abrufen, die alle in diesem Fall die 5 Zeilen, da die "Aktien" noch nicht hinzugefügt wurden. Hast du eine Ahnung wie man das über die Abfrage macht? – Linesofcode

+0

können Sie einige Beispieldaten zur Geige hinzufügen und das gewünschte Ergebnis anzeigen? –

0

Diese Abfrage

SELECT user_id, date_start FROM share_types st,shares sh on sh.share_type_id=st.user_id WHERE type = 'Anual share' and sh.user_id=st.id and sh.the_year=$yearSelectedByUser and Having COUNT(sh.user_id) < 1; 
Verwandte Themen