mySQL SELECT FROM table WHERE ... UND ... UND ... UND
Ich habe eine Tabelle "Artikel" mit den Spalten und Daten:
article_id title body
1 This is the title This is the body text
2 Another title Another body text
Anderen Tabelle "Kategorie" mit den Spalten und Daten:
category_id category
1 localnews
2 visible
3 first10
"Und eine Tabelle "Kategorien" mit den Spalten und Daten:
categories_id article_id category_id
1 1 1
2 1 2
3 1 3
4 2 1
5 2 3
WÄHLEN Sie die Zeile(N) WO Kategorien.category_id = 1 UND =2 UND =3
Ich bin mit:
SELECT articles.article_id, articles.title, articles.body,
categories.article_id, categories.category_id
FROM articles, categories
WHERE articles.article_id = categories.article_id
AND categories.article_id = 1
AND categories.article_id = 2
AND categories.article_id = 3
aber es funktioniert nicht. Offensichtlich mySQL muss eine andere syntax.
Kann mir da jemand helfen?
Dank
- Ihre Abfrage ist äquivalent zu "ich will ein rotes Auto, das eine Blaue Farbe und hat eine gelbe Farbe"
- er ist auf der Suche nach Artikeln, die im alle 3 Kategorien
- Der relationale operator, den Sie benötigen, division, im Volksmund als "der Lieferant liefert alle Teile". Überlegungen gehören, ob genaue Teilung oder die mit Rest und wie Sie zu behandeln und leer divisor.
- Aus der Tabelle "Artikel" wählen Sie nur den ersten Eintrag, das gehört zu ALLEN drei "Kategorien", D. H. localnews, sichtbar und first10. Wie in der Tabelle gezeigt Kategorien der 'article_id' per = 1 category_id 1 und 2 und 3, während der zweite Artikel hat nicht die "sichtbar" - Kategorie, und ich will nicht, um es auszuwählen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich ein bisschen andere Namen für die Tabelle, da in deinem Beispiel die Unterscheidung zwischen
category
undcategories
ist schwer zu bemerken.SELECT
undFROM
... ich dachte, Sie wüssten, wie Sie die Spalten auswählenEiner Spalte einer Zeile nicht 1, 2 oder 3 gleichzeitig, was
AND
festgelegt. VerwendenOR
in IhremWHERE
Zustand. Besser noch - zur besseren Lesbarkeit - Sie könnenIN
:Zusätzlich zu den üblicherweise IN() und mit einem MIT zählen, wäre ich daran interessiert, den Unterschied in der Leistung, indem Sie einen multiple-join wie folgt...
Ja, das sieht vielleicht verschleiern, aber wir denken, es..., indem Sie einen ERSTEN join auf die Kategorien-Tabelle, wo MAN von Ihr bestimmten Kategorien -- DAS ERSTE VON der Instanz von Kategorien sollten Vertreter je nachdem, welche Kategorie hätte die kleinste Granularität. Ex: Ihre Kategorien Neuigkeiten aus Sichtbar und die Ersten 10. Lokale Nachrichten würde wahrscheinlich haben das die meisten Einträge, während die Sichtbare und die Ersten 10 hätte sogar noch weniger... von denen, die haben würde, auch die kleinste Anzahl der Datensätze. Verwenden Sie DIESE Kategorie, weil die where-Klausel.
So, sagen, Sie haben 100.000 Artikel, und 90.000 sind in den lokalen Nachrichten, 45.000 in Sichtbar, und 12.000 in den Ersten 10. Durch starten Sie Ihre Abfrage auf nur diejenigen, die in den 12.000, eliminieren Sie die meisten Daten.
Dann Beitritt in die Tabelle Artikel und Kategorien WIEDER als alias-C2 und C3 jeweils auf der Basis der anderen Bedingungen, wenn gefunden, getan, wenn nicht die, die ausgeschlossen werden.
Wieder, ich bin Fragen, die Auswirkungen auf die Leistung. Ich würde auch einen zusammengesetzten index auf der Tabelle Kategorien auf beide ('article_id' per, category_id)
Kann der Wert nicht werden alle drei Werte gleichzeitig, so sollten Sie besser eine
IN
Klausel in IhremWHERE
zu definieren, die Sie zurückgeben möchten. Geben Sie bereits ein join-Bedingung gibt es, Sie wollen, um zu verschieben, dass einON
- Klausel und nicht wie gut; das heißt:Natürlich, Sie können gehen Sie zum nächsten Schritt und tun:
Wenn Sie wollten stattdessen zeigen Sie nur Artikel angezeigt, die in allen drei Kategorien, dann könnte man einen Ansatz wie: