|
You last visited: Today at 12:50
Advertisement
SQL-Abfrage umwandeln in SQL ohne Unterabfrage
Discussion on SQL-Abfrage umwandeln in SQL ohne Unterabfrage within the Web Development forum part of the Coders Den category.
09/07/2013, 18:08
|
#1
|
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
|
SQL-Abfrage umwandeln in SQL ohne Unterabfrage
Heyho zusammen,
lässt sich diese Abfrage:
PHP Code:
SELECT * FROM items, ( SELECT id FROM items WHERE ( value1=10 AND (value2=11 or value2=12) ) ) as filtered WHERE filtered.id=items.id AND value1=15
ohne Unterabfrage schreiben?
Meine Tabelle dazu sieht so aus:
Code:
id value1 value2
0 1 10
0 4 10
0 5 15
0 15 20
0 10 11
1 15 18
1 2 20
1 3 11
1 6 12
Mit der Abfrage möchte ich alle Ids ehralten, die sowohl unter "value1=10 AND (value2=11 or value2=12)" existieren aber auch gleichzeitig unter "value1=15" existieren. Eine Id soll also nur ausgewählt werden, wenn beide Abfragen richtig sind.
Also würde man sie so verknüpfen:
PHP Code:
value1=10 AND (value2=11 or value2=12) AND value1=15
Das liefert jedoch immer ein leeres Resultat zurück, da ich ja sage "Wähle diejenigen Datensätze aus, die sowohl value1=10 haben und value1=15".
Ich brauche aber viel mehr das:
"Wähle diejenigen Datensätze aus, die sowohl in der Datenbank mit dem Wert value1=10 existieren und mit dem Wert value1=15 und die gleichzeitig noch dieselbe ID haben".
In meinem Beispiel sollen also nur folgende Werte ausgewählt werden:
Code:
id value1 value2
0 15 20
0 10 11
Kriegt man die obere Abfrage ohne Unterabfrage hin?
|
|
|
09/07/2013, 18:41
|
#2
|
elite*gold: 25
Join Date: Apr 2010
Posts: 1,019
Received Thanks: 331
|
Das sind nun 2 unterschiedliche Querys. Einmal value1=10 und value1=15 die gleiche ID haben und die obrige, welche von beiden ists denn nun genau und vorallem, was spricht gegen einen Subquery?
|
|
|
09/07/2013, 21:59
|
#3
|
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
|
Quote:
Originally Posted by Synatex
Das sind nun 2 unterschiedliche Querys. Einmal value1=10 und value1=15 die gleiche ID haben und die obrige, welche von beiden ists denn nun genau und vorallem, was spricht gegen einen Subquery?
|
Ich muss wenn ich diese Methode benutze bis zu 10 Subquerries machen und das zieht Performance wie sonst was. Jede Query die ich spare dürfte Zeit sparen. Ich würde auch gerne Zeiten vergleichen aber mir fällt nicht wirklich mehr ein als die obere Lösung.
|
|
|
09/07/2013, 22:56
|
#4
|
elite*gold: 4
Join Date: Feb 2008
Posts: 3,854
Received Thanks: 1,268
|
Bei der Performance reden wir von "Millisekunden". Ansonsten ggf. weitere Ergebnisse vorher bereits auswerten? Bzw. eine größere Anzahl, zwischenspeichern, etc.
|
|
|
09/08/2013, 12:01
|
#5
|
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
|
Quote:
Originally Posted by Else
Bei der Performance reden wir von "Millisekunden". Ansonsten ggf. weitere Ergebnisse vorher bereits auswerten? Bzw. eine größere Anzahl, zwischenspeichern, etc.
|
Jedes Request muss ich aber ca 10x ausführen und sind als Antwort eines Ajax-Requests gedacht. Plus Dns-LookUp, Html und Paar Php-Code braucht das Ganze trotzdem 2sec und da sind selbst 10msec pro Query in der Summe 100msec und das merkt man schon, daher bin ich für jegliche SQL bezogene Optimierungen dankbar.
|
|
|
09/08/2013, 23:15
|
#6
|
elite*gold: 0
Join Date: Feb 2010
Posts: 72
Received Thanks: 32
|
Ich habs noch nicht verstanden...
Also:
- value1 muss 10 oder 15 sein
- UND value2 muss 11 oder 12 sein
Bin ich da richtig?
BTW:
Quote:
Also würde man sie so verknüpfen:
PHP-Code:
value1=10 AND (value2=11 or value2=12) AND value1=15
|
Das kann nichts zurückgeben, da value1 nicht 10 UND 15 gleichzeitig sein kann
Sowie wenn du fragen würdest:
if( i == 0 && i == 1)
|
|
|
09/09/2013, 00:22
|
#7
|
elite*gold: 0
Join Date: Oct 2012
Posts: 71
Received Thanks: 24
|
propire es mal so der Query ist kürzer und übersichtlicher und macht genau das gleich
PHP Code:
SELECT t1.value1, t1.value2, t2.value1 AS value3, t2.value2 AS value4 FROM items t1 LEFT JOIN items t2 ON t2.value1 = 15 WHERE t1.value1 = 10 AND t1.value2 IN(11,12);
|
|
|
09/09/2013, 00:48
|
#8
|
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
|
Quote:
Originally Posted by _robox
propire es mal so der Query ist kürzer und übersichtlicher und macht genau das gleich
PHP Code:
SELECT t1.value1, t1.value2, t2.value1 AS value3, t2.value2 AS value4 FROM items t1 LEFT JOIN items t2 ON t2.value1 = 15 WHERE t1.value1 = 10 AND t1.value2 IN(11,12);
|
Danke dir schonmal, ist aber leider langsamer. :/
Quote:
Originally Posted by flogi333
Ich habs noch nicht verstanden...
Also:
- value1 muss 10 oder 15 sein
- UND value2 muss 11 oder 12 sein
Bin ich da richtig?
BTW:
Das kann nichts zurückgeben, da value1 nicht 10 UND 15 gleichzeitig sein kann
Sowie wenn du fragen würdest:
if( i == 0 && i == 1)
|
Nein value1 muss 10 und 15 sein, wenn die item_id dieselbe ist.
Also bei ein und demselben item muss sowohl ein Eintrag value1=10 als auch ein Eintrag value1=15 existieren.
|
|
|
09/09/2013, 01:10
|
#9
|
elite*gold: 0
Join Date: Oct 2012
Posts: 71
Received Thanks: 24
|
Quote:
Originally Posted by Shadow992
Danke dir schonmal, ist aber leider langsamer. :/
|
das Ware mir aber neu das 'LEFT, JOIN' langsamer ist in gegen teil sie sind sogar aus per Formens grünten bestens geeignet um die anfragen zu buddeln.
ich wurde male dein php Code anschauen ob Mann ihn eventuell optimieren kann.
|
|
|
09/09/2013, 12:59
|
#10
|
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
|
Quote:
Originally Posted by _robox
das Ware mir aber neu das 'LEFT, JOIN' langsamer ist in gegen teil sie sind sogar aus per Formens grünten bestens geeignet um die anfragen zu buddeln.
ich wurde male dein php Code anschauen ob Mann ihn eventuell optimieren kann.
|
Stimmt, war mein Fehler, ich hatte vergessen, dass mein Server immer SQL-Abfragen cached und meine SQL-Abfragen mit Subquerries waren bereits gecached, deswegen ging das extrem schnell. Jetzt wo der Cache ausgeschalten ist habe ich folgendes Ergebnis:
Quote:
10000 Abfragen mit Subquerries:
29sec
10000 Abfragen mit Left Join:
16sec
|
Danke dir, das ist genau der Geschwindigkeitsschub den ich brauchte. 
Damit wäre die Frage für mich gelöst. Danke nochmals an alle Helfer.
|
|
|
09/14/2013, 23:08
|
#11
|
elite*gold: 25
Join Date: Apr 2010
Posts: 1,019
Received Thanks: 331
|
Sorry dass das ganze etwas spät kommt, aber mit der oben genannten Formel hättest du 0 -15 - 20 gar nicht rausbekommen dürfen was du als Beispiel gegeben hast.
Weiß nicht wieviele Einträge das sind, dass ganze sollte aber auch (wenn ich die Beschreibung soweit richtig mitgekriegt hab) ohne extra Join gehen...
PHP Code:
SELECT * FROM `items` WHERE value1 IN(10,15) AND value2 IN(11,12)
|
|
|
 |
Similar Threads
|
AFK Abfrage ?
09/05/2012 - Guild Wars 2 - 4 Replies
Servus, habe grad bissel an meinem eigenen Bot rumgeschraut der nu auch laufen kann und auch das ein oder andere Event erledigt. So nun lasse ich ihn die dritte Testrunde laufen und bekomm aufeinmal ein Fenster (wie die normalen fenster wenn man mit einem NPC spricht) und dort steht " Wer ist der Moa wer ist der Mann ?" und als antwort möglichkeiten gabs Rechts , Links und in der Mitte. Dazu läuft eine art Counter runter. Ich hab aus Schock erstmal irgendwo draufgekickt. Ne minute später kam...
|
bot abfrage
04/08/2011 - Ragnarok Online - 4 Replies
hallo ich habe beim server wo ich bin wenn man da in iein dun is eine botabfrage dann kommt ein bild man muss die zahl eingeben und dann kann man weiter machen wenn ich es aber mit openkore machen wie soll das gehen
danke für die hilfe
|
Abfrage in dec?
12/02/2010 - General Coding - 7 Replies
Hallo Leute,
ich habe mir hier schnell ein kleines Programm zum üben geschrieben und hab nun eine Frage.
Der Code sieht so aus:
/*
Autor: ******
E-mail: ******
Datum: 28.11.2010
Programm: Check if letter is uppercase or not
|
If abfrage
12/29/2009 - AutoIt - 8 Replies
Hallo leute.
Wollt ma fragen ob mir jemand sagen könnte wie ich abfragen kan ob in einer input box z.b steht xD und dan in der if abfrage so abfragen könnte wen dort xD steht das er z.b das script schliest weis das einer?
|
All times are GMT +1. The time now is 12:53.
|
|