2016-07-12 8 views
1

Ich versuche eine Abfrage zu schreiben, bei der alle Datensätze aus einer Tabelle ausgewählt werden, in der bestimmte komplexe/verschachtelte Kriterien erfüllt sind. Die Logik in meiner Abfrage ist meiner Meinung nach korrekt, aber das Problem, auf das ich gestoßen bin, ist die letzte Unterabfrage (siehe Beispiel), die mehr als 1 Zeile zurückgibt, was ich erwarte/brauche. Das Problem ist also, wie gehe ich damit um? Unterstützt MySQL eine Art Looping oder ein gesetztes Kriterium?MySQL Wie mit Fehler umzugehen: Unterabfrage gibt mehr als 1 Zeile zurück?

SELECT c.primary_key 
FROM esjp_content c 
WHERE template_id = (
    SELECT DISTINCT esjp_content.template_id 
    FROM esjp_content 
    INNER JOIN esjp_hw_config ON esjp_content.template_id = esjp_hw_config.proc_id 
    INNER JOIN esjp_assets ON esjp_hw_config.primary_key = esjp_assets.hw_config_id 
    WHERE 
     esjp_content.summary_id > 0 
      AND 
     (esjp_assets.asset_label='C001498500' OR esjp_assets.asset_label='H0065' OR esjp_assets.asset_label='L0009') 
    ) 
     AND 
    EXISTS (SELECT 1 FROM esjp_content c2 WHERE c2.summary_id = c.primary_key) 
     AND 
    c.primary_key != (
     /* This subquery returns more than 1 result. */ 
     SELECT esjp_signoffs.content_id 
     FROM esjp_signoffs 
     INNER JOIN esjp_assets ON esjp_signoffs.asset_id = esjp_assets.primary_key 
     WHERE 
      esjp_signoffs.user_id=1 
       AND 
      (esjp_assets.asset_label='C001498500' OR esjp_assets.asset_label='H0065' OR esjp_assets.asset_label='L0009') 
    ); 

Weitere Einzelheiten über die Tabellen finden Sie in diesem other StackOverflow post ich heute früher gemacht. (Dies ist eine ganz andere Frage.)

Antwort

1

Wenn ich die

c.primary_key != (
    /* This subquery returns more than 1 result. */ 
    SELECT esjp_signoffs.content_id 
    FROM esjp_signoffs 
    INNER JOIN esjp_assets ON esjp_signoffs.asset_id = esjp_assets.primary_key 
    WHERE 
     esjp_signoffs.user_id=1 
      AND 
     (esjp_assets.asset_label='C001498500' OR esjp_assets.asset_label='H0065' OR esjp_assets.asset_label='L0009') 
); 

Rückkehr mehr als eine Zeile korrekt under .. Sie nicht in verwenden könnte ..

c.primary_key not in (

oder

inner join ( .....) t on c.primary_key != t.the_column_you_need 
+0

Danke! Das 'NOT IN' hat es geschafft! –

+0

@ JimFell danke .. – scaisEdge