Seite 1 von 1

Verschachtelte Abfragen bei MySQLdb

Verfasst: Montag 14. Oktober 2013, 13:36
von Python93
Hallo zusammen,
ich habe eine kurze Frage.

Ich habe folgende Datenbank:
+---------+---------------------+-----------+---------+-------------+----------+--------+-----------+--------------------+
| ID | Datum YYYY-MM-DD | server | Lictype | Lizenz | Version | Anzahl | MaxAnzahl | sonstiges |
+---------+---------------------+-----------+---------+-------------+----------+--------+-----------+--------------------+

Ich benötige alle Datensätze vom Server 'ABCD' und 'ABCD2' bei denen die Lizenz = 'bla', 'blubb', 'foo' ist.

Mein Statement sieht bisher so aus:

Code: Alles auswählen

"SELECT * FROM zeile WHERE server LIKE 'ABCD' OR  'ABCD2' AND WHERE lizenz LIKE 'bla' OR 'blubb' OR 'foo'"
Stimmt das Statement? Da ich in der DB knapp 1Mio Einträge habe, dauert das "Probier es aus" nunmal pro Durchlauf knapp 30min.
Bitte helft mir und verbessert mein Statement, vielen Lieben Dank!

Freundliche Grüße, Python93

Re: Verschachtelte Abfragen bei MySQLdb

Verfasst: Montag 14. Oktober 2013, 13:43
von EyDu
Python93 hat geschrieben:Stimmt das Statement?
Nein, du hast ``OR`` falsch verstanden.
Python93 hat geschrieben:Da ich in der DB knapp 1Mio Einträge habe, dauert das "Probier es aus" nunmal pro Durchlauf knapp 30min.
Warum hast du keine kleinere Datenbank für Tests?

Re: Verschachtelte Abfragen bei MySQLdb

Verfasst: Montag 14. Oktober 2013, 13:52
von BlackJack
@Python93: Das geht so nicht weil ``OR`` in SQL so nicht funktioniert, genausowenig wie das in Python so funtkionieren würde. Das ist keine natürliche Sprache wo man das Oder so interpretieren könnte, also ``if a == b or c:`` könnte man als Mensch verstehen als „a gleich b oder a gleich c”, aber der Rechner versteht das als ``(a == b) or c``. In Python ist das syntaktisch richtig weil jeder Wert auch einen „Wahrheitsgehalt” hat. In SQL weiss ich jetzt gerade nicht ob das überhaupt legal ist, aber es ist in jedem Fall semantisch falsch. Du willst ``if a == b or a == c:`` beziehungsweise ``if a in [b, c]:``. Beides kann man mit den entsprechenden Operatoren auch in SQL ausdrücken.

``WHERE`` kommt in Deinem Ausdruck zweimal vor, das ist auch falsch.

Warum verwendest Du ``LIKE`` statt ``=`` wenn Du sowieso keine Platzhalter verwendest? *Das* könnte der Hauptgrund sein warum das langsam ist. Letztendlich ist das mit der Laufzeit eine schwache Begründung es nicht wenigstens soweit zu bringen, dass eine syntaktisch korrekte Anfrage gestellt wird. Denn Syntaxfehler werden sofort gemeldet. Die 30 Minuten mag ich auch nicht so ganz glauben, es sei denn die hängen wirklich am ``LIKE``. Du könntest zum testen auch eine kleinere Tabelle erstellen mit einem Ausschnitt der tatsächlichen Tabelle und/oder mit Testdaten.

Re: Verschachtelte Abfragen bei MySQLdb

Verfasst: Montag 14. Oktober 2013, 13:55
von Python93
Ich verstehe. Dann habe ich das "OR" wohl missverstanden.
Wie kann man dann überhaupt solche verschachtelten Abfragen machen? Ich bin nicht wirklich ein SQL-Kenner :oops:

Ich bereite mir eine kleinere DB auf. Danke für den Tipp.

Re: Verschachtelte Abfragen bei MySQLdb

Verfasst: Montag 14. Oktober 2013, 14:30
von EyDu
Hier hast du doch gar keine verschachtelten Abfragen. Was du willst ist doch wahrscheinlich einfach nur:

Code: Alles auswählen

SELECT *
FROM zeile
WHERE
    (server='ABCD' OR server='ABCD2') AND
    (lizenz='bla' OR lizenz='blubb' OR lizenz='foo')

Re: Verschachtelte Abfragen bei MySQLdb

Verfasst: Montag 14. Oktober 2013, 14:32
von BlackJack
@Python93: Ich sehe da nichts verschachteltes an der Abfrage. Das ist eine ganz normale und einfache Anfrage die Du da stellen willst. Arbeite ein SQL-Tutorial durch. Das sind absolute Grundlagen. Learn SQL The Hard Way ist zwar noch nicht fertig, aber es ist für einen Start in SQL IMHO durchaus schon geeignet.

Re: Verschachtelte Abfragen bei MySQLdb

Verfasst: Montag 14. Oktober 2013, 14:33
von Sirius3
@Python93: der Ausdruck heißt: "SELECT * FROM zeile WHERE server in ('ABCD', 'ABCD2') AND lizenz in ('bla', 'blubb', 'foo')"
wenn der aber bei 1.3Mio Einträgen länger als 30s braucht, würde ich den Server aus den 80er-Jahren durch ein moderneres Gerät ersetzen.