2017-11-07 4 views
0
select 
    sld.linkid,sld.accept,scd.catid,scd.catname,scd.caturl,scd1.parentcatid 
    from sound_link_droos sld 
    INNER JOIN sound_cat_droos scd 
    ON sld.catid=scd.catid 
OR 
    INNER JOIN sound_cat_droos scd1 
    ON sld.catid=scd1.parentcatid 
    WHERE accept = '1' AND scd.catname = '$catname'"); 

Ich möchte wissen, ob ich in diesem statment haben oder oder ... wenn die eine innere Verknüpfung Rückkehr falsSQL mit INNER JOIN für zwei Tabellen mit oder vor dem zweiten INNER JOIN

sound_cat_droos

Catidcatnameparentidaccepturl 1David01http: //www.example.com 2Jazz music11http: //www.example.com

sound_link_droos

l inkidlinknamecatidaccepturl 1my love11http: //www.example.com/audio.mp3 2MY Baby 21http: //www.example.com/audio.mp3
+2

Nein, aber Sie können 2 'LINKE VERBINDUNGEN' haben, die als' OR' fungieren würden. –

+0

können Sie es bitte erklären –

+0

Was ist der richtige Weg, um diese Frage zu beantworten? –

Antwort

0

Ohne eine Spezifikation können wir nur erraten, was die Abfrage zurückgeben soll.

Also hier ist eine Vermutung.

Wir bekommen alle _cat_ wo catname einen gewissen Wert übereinstimmt:

SELECT scd.catid 
     , scd.catname 
     , scd.caturl 
    FROM sound_cat_droos scd 
    WHERE scd.catname = 'someval' 

Wir wissen, dass ein _cat_ die Eltern anderer _cat_ sein könnte. Und wir wollen auch diese Kinder zurückgeben _cat_. Hier ist eine Abfrage zu tun, dass:

SELECT scc.catid 
     , scc.catname 
     , scc.caturl 
    FROM sound_cat_droos scc 
    JOIN sound_cat_droos scp 
     ON scp.catid = scc.parentcatid 
    WHERE scp.catname = 'someval' 

Wir haben eine UNION ALL gesetzt Operator verwenden können, um die Ergebnisse aus diesen beiden Abfragen in einem einzigen Satz zusammenfassen. Und dann können wir diese kombinierten Satz zu _link_

SELECT sld.linkid 
     , sld.accept 
     , sca.catid 
     , sca.catname 
     , sca.caturl 
    FROM (SELECT scd.catid 
       , scd.catname 
       , scd.caturl 
      FROM sound_cat_droos scd 
      WHERE scd.catname = 'someval' 
      UNION ALL 
      SELECT scc.catid 
       , scc.catname 
       , scc.caturl 
      FROM sound_cat_droos scc 
      JOIN sound_cat_droos scp 
       ON scp.catid = scc.parentcatid 
      WHERE scp.catname = 'someval' 
     ) sca 
    JOIN sound_link_droos sld 
     ON sld.catid = sca.catid 
    AND sld.accept = '1' 

beitreten Wenn es wichtig ist (aus irgendeinem Grund) zu wissen, ob die _cat_ wir abgestimmt eine direkte Übereinstimmung war, oder war ein Spiel, um ein Kind _cat_, können wir eine umfassen discriminator-Spalte in der Inline-View-Abfrage und gibt diese im Resultset zurück.

SELECT sld.linkid 
     , sld.accept 
     , sca.catid 
     , sca.catname 
     , sca.caturl 
     , sca.src 
    FROM (SELECT 1 AS src 
       , scd.catid 
       , scd.catname 
       , scd.caturl 
      FROM sound_cat_droos scd 
      WHERE scd.catname = 'someval' 
      UNION ALL 
      SELECT 2 AS src 
       , scc.catid 
       , scc.catname 
       , scc.caturl 
      FROM sound_cat_droos scc 
      JOIN sound_cat_droos scp 
       ON scp.catid = scc.parentcatid 
      WHERE scp.catname = 'someval' 
     ) sca 
    JOIN sound_link_droos sld 
     ON sld.catid = sca.catid 
    AND sld.accept = '1' 

Wir erraten nur die Anforderungen, zu welchem ​​Ergebnis zurückgegeben werden soll. Und diese Abfrage entspricht möglicherweise Ihrer Spezifikation. Aber wir sind nicht was diese Spezifikation ist.

+0

der Katname auf dem sup-Ordner und nicht derselbe, den gebe ich Ihnen Beispiel: Hauptdatei catid = 1 catname = Musik parentcatid = 0 caturl = http: //www.beispiel.com Unterordner catid = 2 catname = jazz parentcatid = 1 caturl = http: //www Beispiel.com –

+0

sie sind Match auf Catid für den Hauptordner und parentcatid = catid –

+0

@ AlmafrahAl-islamia: bitte relevante Informationen zu der * Frage *, lassen Sie es nicht als Kommentar auf eine Antwort. (Es gibt eine Schaltfläche "Bearbeiten" in der unteren linken Ecke) Die Frage.) Erwägen Sie, diese Beispieldaten im Tabellenformat zu formatieren und auch zu zeigen, welches Ergebnis zurückgegeben werden sollte.Wählen Sie auch einen Testfall unter http://sqlfiddle.com, um die Spezifikation zu verdeutlichen.Abgesehen davon, raten wir nur. – spencer7593

1

beste Lösung ist Union zu verwenden, um alle anstelle oder Mitglied werden als unten angegeben:

select sld.linkid, sld.accept,s cd.catid, scd.catname, scd.caturl, scd1.parentcatid 
from sound_link_droos sld inner join 
    sound_cat_droos scd 
    on sld.catid = scd.catid or sld.catid = scd.parentcatid 
where accept = 1 and scd.catname = '$catname'; 

Solche Verknüpfungen sind in der Regel Performance-Killer, und dies könnte nicht:

select sld.linkid,sld.accept,scd.catid,scd.catname,scd.caturl,scd1.parentcatid from sound_link_droos sld 
INNER JOIN sound_cat_droos scd 
ON sld.catid=scd.catid 
where accept = '1' and scd.catname = '$catname' 
union all 
select sld.linkid,sld.accept,scd.catid,scd.catname,scd.caturl,scd1.parentcatid from sound_link_droos sld 
INNER JOIN sound_cat_droos scd1 
ON sld.catid=scd1.parentcatid 
where accept = '1' and scd1.catname = '$catname'; 
1

Sie or Logik in der on Klausel wie folgt ausdrücken t tu was du wirklich willst. Wenn nicht, fragen Sie eine andere Frage mit Beispieldaten und gewünschten Ergebnissen.

Ich entfernte die einfachen Anführungszeichen rund um die '1', weil ich denke, der Wert ist numerisch. Zahlen sollten mit Zahlen verglichen werden.

Parameter müssen ebenfalls angegeben werden. Sie sollten keine Abfragezeichenfolge mit Parameterwerten erstellen. Erfahren Sie, wie Sie Parameter richtig verwenden.