Ich habe 2 Tabellen in meiner Datenbank. Eine ist für Bestellungen und eine für Unternehmen.
Bestellungen haben diese Struktur:
OrderID | attachedCompanyIDs
------------------------------------
1 1,2,3
2 2,4
Und das Unternehmen hat diese Struktur:
CompanyID | name
--------------------------------------
1 Company 1
2 Another Company
3 StackOverflow
4 Nothing
Um die Firmennamen eines Auftrags zu erhalten, kann ich eine Abfrage als solche durchführen:
SELECT name FROM orders,company
WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)
Diese Abfrage funktioniert einwandfrei, die folgende Abfrage jedoch nicht.
SELECT name FROM orders,company
WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)
Warum funktioniert die erste Abfrage, aber nicht die zweite?
Die erste Abfrage gibt Folgendes zurück:
name
---------------
Company 1
Another Company
StackOverflow
Die zweite Abfrage gibt nur Folgendes zurück:
name
---------------
Company 1
Warum ist das so, warum gibt die erste Abfrage alle Unternehmen zurück, während die zweite Abfrage nur die erste zurückgibt?
Antworten:
attachedCompanyIDs
ist ein Skalarwert, der inINT
(Typ voncompanyID
) umgewandelt wird.Die Besetzung gibt nur Zahlen bis zur ersten Nicht-Ziffer zurück (in Ihrem Fall ein Komma).
So,
In
PostgreSQL
können Sie den String in ein Array umwandeln (oder ihn zunächst als Array speichern):und dies würde sogar einen Index auf verwenden
companyID
.Leider funktioniert dies nicht,
MySQL
da letzteres keine Arrays unterstützt.Sie finden diesen Artikel vielleicht interessant (siehe
#2
):Aktualisieren:
Wenn die Anzahl der Werte in den durch Kommas getrennten Listen angemessen begrenzt ist (z. B. nicht mehr als
5
), können Sie versuchen, diese Abfrage zu verwenden:quelle
FIND_IN_SET
funktioniert, verwendet jedoch keine Indizes und ist möglicherweise langsam mit vielen Informationen in der Firmentabelle.pos
Elemente vom Anfang desCVS
und wandelt den Rest in eine Ganzzahl um.10 things in MySQL (that won’t work as expected)
CROSS JOIN
? Sind sie in MySQL nicht alle gleich ?attachCompanyIDs ist eine große Zeichenfolge, daher versucht mysql, eine Firma in dieser Umwandlung in eine Ganzzahl zu finden
wenn Sie wo in verwenden
also wenn comapnyid = 1:
Dies ist return true
aber wenn die Nummer 1 nicht an erster Stelle steht
seine Rückkehr falsch
quelle
Um den Namen aller verbundenen Unternehmen zu erhalten, nicht basierend auf einer bestimmten ID.
quelle
Da die zweite Abfrage nach Zeilen mit der ID 1 ODER 2 ODER 3 sucht, sucht die erste Abfrage nach einem der durch Kommas getrennten Werte, die in der Unternehmens-ID vorhanden sind.
und ein weiteres Problem hierbei ist, dass Sie die Tabellen nicht über einen gemeinsamen Schlüssel in Ihrem Speicherort verknüpfen, sodass Sie eine Mutation von Zeilen erhalten, die = count (table1) * count (table2);
Ihr Problem besteht wirklich mit Teil 2 meiner Antwort. (mit Ihrer zweiten Anfrage)
quelle
Lassen Sie mich erklären, wann FIND_IN_SET und wann IN verwendet werden soll.
Nehmen wir Tabelle A mit Spalten mit den Namen "aid", "aname". Nehmen wir Tabelle B mit den Spalten "bid", "bname", "aids".
Jetzt gibt es Dummy-Werte in Tabelle A und Tabelle B wie unten.
Tabelle A.
Hilfe aname
1 Apple
2 Banane
3 Mango
Tabelle B.
Gebot bname Hilfsmittel
1 Apfel 1,2
2 Banane 2,1
3 Mango 3,1,2
Fall 1: Wenn Sie die Datensätze aus Tabelle b abrufen möchten, in denen 1 Wert in den Hilfsspalten vorhanden ist, müssen Sie FIND_IN_SET verwenden.
Abfrage: Wählen Sie * aus A JOIN B ON FIND_IN_SET (A.aid, b.aids), wobei A.aid = 1;
Fall 2: Wenn Sie diese Datensätze aus Tabelle a abrufen möchten, deren Wert 1 ODER 2 ODER 3 in Hilfsspalten enthält, müssen Sie IN verwenden.
Abfrage: Wählen Sie * aus A JOIN B ON A.aid IN (b.aids);
Nun hier bis zu Ihnen, was Sie durch MySQL-Abfrage benötigen.
quelle
quelle