2017-03-17 4 views
-2
product_options 
ID | Option 
1 | One 
2 | Two 
3 | Three 

product_to_options 
ID | Product | Option 
1 | 1  | 1 
2 | 2  | 2 
3 | 2  | 3 

Im Grunde brauche ich alle Zeilen aus product_options zu bekommen, abgesehen von den diejenigen, die geliefert werden, in denen die Optionen auf den gleichen Produkten sind.Wählen Sie Zeilen, in denen Join-Tabelle hat denselben Wert

Zum Beispiel:

den Wert von 1 Geben, würde nichts zurück.

Passing den Wert von 2, zurückkehren würde die Option mit ID 3

den Wert von 3 Geben, zurückkehren würde die Option mit der ID 2.

+1

Wer ist "Wert" in Ihren Beispielen? ID, Produkt oder Option? –

+0

@JuanCarlosOropeza der Wert wäre die Option –

+0

Ist Verwirrung, weil Sie zwei 'Option' eine ganze Zahl und eine Zeichenfolge haben. Sie sollten die zweite in 'Option_ID' umbenennen. –

Antwort

0

Sie eine Tabelle mit sich selbst verbinden können, filtern Sie die linke Tabelle auf den Wert und den Wert aus der rechten Tabelle zurückgeben.

SELECT 
    pto2.Option 
FROM 
    product_to_options pto1 
    INNER JOIN product_to_options pto2 
    ON pto1.Product = pto2.Product 
    AND pto1.ID <> pto2.ID 
WHERE 
    pto1.option = @option; 

Sie sollten beachten, dass Sie abhängig von den Daten mehr als einen Wert zurück erhalten können.

Here's a working sample with minor syntax changes for sql server (Sie müssen nur Text-Ergebnisse oder klicken Sie sich durch das Netz überprüfen)

+0

Was soll ich tun, wenn ich die Optionen "1" und "2" aktivieren möchte? –

+0

@RyanHipkiss Das ist eine andere Frage. Normalerweise verwenden Sie einen IN und einen Zähler. siehe http://StackOverflow.com/a/18860401/119477 –

1

ich habe mein Bestes gegeben, was ich verstehe.

  • pto.Product = @option so erhalten Sie alle Zeilen @option
  • pto.Option <> @option entsprechen aber

diejenigen mit der gleichen ID filtern.

SELECT po.* 
FROM product_options po 
JOIN (
     SELECT pto.Option 
     FROM product_to_options pto 
     WHERE pto.Product = @option 
     AND pto.Option <> @option 
    ) as filter 
    ON PO.ID = filter.Option 
+0

Nicht sicher, warum Sie mit einer Inline-Ansicht hier ging, aber zumindest es richtig heraus filtert Optionen mit der gleichen ID –

+0

@ConradFrix Nicht sicher, was Sie meinen, aber wenn Sie sehen eine bessere Möglichkeit, es zu schreiben, fühlen Sie sich frei, es als eine zweite Möglichkeit zu bearbeiten. –

Verwandte Themen