![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Gruppenlos
Registriert seit: 24.08.2005
Beiträge: 26
|
Um ein wenig an Performance zu gewinnen, möchte ich versuchen 2 MySQL Abfragen zu einer zusammenzufassen.
Ich benötige mal einen Denkanstoss, ob es überhaupt möglich ist. Ich habe eine Tabelle test, welche unter anderem eine Reihe namens zip hat. Nun möchte ich, wenn ich mir EIN Eintrag anzeigen lasse, eine Auswahl Alternativen ausgeben, welche im Bereich zip +/- 50 liegt. Meine Beiden Abfragen lauten daher: PHP-Code:
Code:
CREATE TABLE `test` ( `id` int(5) NOT NULL auto_increment, `zip` int(5) NOT NULL default '0', UNIQUE KEY `id` (`id`) ) TYPE=MyISAM; INSERT INTO `test` VALUES (1, 12349); INSERT INTO `test` VALUES (2, 12333); INSERT INTO `test` VALUES (3, 10405); INSERT INTO `test` VALUES (4, 10611); INSERT INTO `test` VALUES (5, 12357); INSERT INTO `test` VALUES (6, 10633); |
|
|
|
|
|
Nach oben #2 |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
1. mysql kennt kein !=, es muss <> heißen.
2. muss ich erstmal überlegen
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
Nach oben #3 | |
|
Gruppenlos
Registriert seit: 24.08.2005
Beiträge: 26
|
das ging aber fix
Also die Abfragen funktionieren, die Dokumentation zeigt mir auch, dass meine Wahl korrekt war: http://dev.mysql.com/doc/mysql/en/op...recedence.html Zitat:
Hier das Script in Aktion: http://www.shisha-guide.info/?seite=cafes&ID=3[/quote] |
|
|
|
|
|
|
Nach oben #4 |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
ok ich gestehe, mein sql unterricht ist schon ne weile her. damals gings nicht. aber gut zu wissen.
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
Nach oben #6 |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
danke für den Dump
Nach langem testen und suchen: MySQL mag keine Select in Select (Access schon) und eine andere möglichkeit fiele mir nicht ein, daher wäre die einzige möglichkeit, ein 2. query zu sparen, wenn du die komplette Tabelle als Array ziehst und dann mit PHP die gesuchten Werte rausziehst. Das ist aber beim besten willen nicht empfehlenswert, da Mysql wesentlich schneller arbeiten würde. Performancegewinn würdest du damit also nicht wirklich machen. Schau lieber ob du andere Faktoren/Skripte/Funktionen ändern/verbessern kannst.
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
Nach oben #7 |
|
Erfahrener Benutzer
Registriert seit: 19.08.2005
Beiträge: 114
|
Code:
SELECT t.zip FROM `test` AS t LEFT JOIN test AS n ON n.id = $id WHERE ( t.zip -50 ) <= n.zip AND ( t.zip +50 ) >= n.zip
__________________
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to build bigger and better idiots. So far, the universe is winning. |
|
|
|
|
|
Nach oben #8 | |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.616
|
Zitat:
Also ich denke, dass das nicht geht. Man liest ja zwei ganz verschiedene Sachen aus. Irgendwie .. Also ich hätte das jetzt so gelöst, aber das sind natürlich auch zwei Abfragen. Halte ich aber nicht unbedingt für schlimm: PHP-Code:
|
|
|
|
|
|
|
Nach oben #9 |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
verdammt das klappt sogar
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
Nach oben #10 | |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.616
|
Zitat:
Ah doch. Super Aber ein Posting ohne Erläuterung ist genau nichts wert, weil man es dann nicht auf andere Problem transferieren kann ... demnach .. bitte erklären. Grüße Ben. |
|
|
|
|
|
|
Nach oben #11 |
|
Erfahrener Benutzer
Registriert seit: 19.08.2005
Beiträge: 114
|
jaja ok ich war halt in zeitdruck, als ichs gepostet habe.
Code:
SELECT t.zip FROM `test` AS t LEFT JOIN test AS n ON n.id = $id WHERE ( t.zip -50 ) <= n.zip AND ( t.zip +50 ) >= n.zip Er hängt an jede Zeile nocheinmal beide spalten id und zip an, allerdings vom Datensatz, bei dem id = $id ist. Angenommen id = 3, so könnte das ganze jetzt so aussehen: Code:
+----+-----+----+-----+ |t.id|t.zip|n.id|n.zip| +----+-----+----+-----+ | 1|14522| 3| 5626| +----+-----+----+-----+ | 2| 918| 3| 5626| +----+-----+----+-----+ | 3| 5626| 3| 5626| +----+-----+----+-----+ nun wird einfach überprüft, ob t.zip = n.zip +/- 50 ist, wenn ja, wird der datensatz ausgelesen, wenn nein, eben nicht. So einfach ist das naja einen nachteil hat es schon: Ich vermute, dass SQL die beiden letzten zeilen für alle datensätze extra ausliest, was natürlich bei großen tabellen ein geschwindigkeits nachteil sein kann. Es müsste allerdings auch mit selects in selects funktionieren, allerdings kenn ich mich damit net aus...
__________________
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to build bigger and better idiots. So far, the universe is winning. |
|
|
|
|
|
Nach oben #12 |
|
Mensch
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
|
MySQL 4.0.24 (Debian-Package) unterstützt keine Select in Select Abfragen.
Neuere Versionen kann ich im moment nich testen, da der Mirror auf arbeit nicht der neuste ist, sorry
__________________
I did it my way - Senseless-Blog |
|
|
|
|
|
Nach oben #13 | ||
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.616
|
Zitat:
Zitat:
Grüße Ben. |
||
|
|
|
|
|
Nach oben #14 |
|
Erfahrener Benutzer
Registriert seit: 19.08.2005
Beiträge: 114
|
http://dev.mysql.com/doc/mysql/en/subqueries.html
Code:
SELECT zip FROM `test` WHERE ( zip -50 ) <= (SELECT zip FROM test WHERE id = $id) AND ( zip +50 ) >= (SELECT zip FROM test WHERE id = $id) LIMIT 0 , 30 Für jede Zeile wird seperat noch einmal der zip wert der spalte ausgelesen, die die id 2 hat. dieser wert wird dann mit dem zip wert der eigentlichen Spalte verglichen. auf das Beispiel von vorhin übertragen sähe die Tabelle so aus: Code:
+----+-----+--------------+ | id| zip|SELECT zip ...| +----+-----+--------------+ | 1|14522| 5626| +----+-----+--------------+ | 2| 918| 5626| +----+-----+--------------+ | 3| 5626| 5626| +----+-----+--------------+
__________________
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to build bigger and better idiots. So far, the universe is winning. |
|
|
|