Sehr seltsam verbessern könnte, dass die Fremdschlüsselspalte in den productswords
(Produkt Schwerter ?) Tabelle heißt pw
und nicht . (Aber es ist nur ein Spaltenname, können wir es nennen, was wir wollen. Wenn der Fremdschlüssel etwas anderes tatsächlich genannt wird, dann ersetzen pw.pw
in den Abfragen unten mit pw.column_name
...)
Um Produkte zu finden, die beide passen von die zwei Wörter, dh, geben nur ein Produkt zurück, wenn es mit dem Wort "nike" übereinstimmt und wenn es mit dem Wort "free" übereinstimmt ...
Wir können eine Join-Operation verwenden, kombiniert mit einer GROUP BY
und einer HAVING
Klausel. ..
SELECT pw.productid
FROM productwords pw
JOIN words w
ON w.id = pw.pw
AND w.word IN ('nike','free') -- keywords to match
GROUP BY pw.productid
HAVING COUNT(DISTINCT w.word) = 2 -- number of keywords to match
Um nur eine Anzahl zu bekommen, können wir das in Parens und Referen umwandeln ce es als Inline-Ansicht ...
SELECT COUNT(1)
FROM (SELECT pw.productid
FROM productwords pw
JOIN words w
ON w.id = pw.pw
AND w.word IN ('nike','free') -- keywords you are looking for
GROUP BY pw.productid
HAVING COUNT(DISTINCT w.word) = 2 -- number of keywords to match
) v
Es andere Abfragemuster sind, die ein gleichwertiges Ergebnis zurückkehren wird.
Zum Beispiel ein EXISTS (correlated subquery)
Muster unter Verwendung von nur die Produkte zu erhalten, die beide der angegebenen Wörter passen ...
SELECT pw.productid
FROM productwords pw
WHERE EXISTS (SELECT 1
FROM words w
WHERE w.id = pw.pw -- related to row on outer query
AND w.word IN ('nike','free')
)
GROUP BY pw.productid
HAVING COUNT(DISTINCT pw.pw) = 2
Um nur eine Zählung wieder wickeln, dass in Pars und darauf verweisen als Inline-Ansicht.
Für nicht-triviale Sätze, mit geeigneten Indizes zur Verfügung können erheblich Leistung beiden Abfragen verbessern.Zum Beispiel
... ON productswords (pw, productid)
... ON words (word, id)
Post einige Beispieldaten und das gewünschte Ergebnis. –
Bitte schreiben Sie Ihre Tabellenstruktur und einige Beispieldaten ... – HorusKol