Portal > Foren > Datenbanken, Server, Betriebssysteme und sonstige Programmiersprachen > Datenbanken > 2 Abfragen einer Tabelle zusammenfassen - JOIN?
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 24.08.2005, 14:30 Nach oben    #1
Gruppenlos
 
Benutzerbild von derMaggus
 
Registriert seit: 24.08.2005
Beiträge: 26
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

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:
<?php

    $sql 
mysql_query("SELECT zip AS current_zip 
                            FROM test 
                            WHERE id = '"
.$_GET['id']."' LIMIT 1") or die(mysql_error());

    
$row mysql_fetch_assoc($sql);

    
$sql_ mysql_query("SELECT id, zip 
                            FROM test 
                            WHERE 
                                (zip-50) <= "
.$row["current_zip"]."
                            AND 
                                (zip+50) >= "
.$row["current_zip"]."
                            AND id != "
.$_GET['id']."") or die(mysql_error());


    while (
$res mysql_fetch_assoc($sql_))
    {
        echo 
'<pre>'.$res["zip"].'</pre>';
    }


?>
Wer selber ein wenig spielen möchte, kann folgenden Dump verwenden:
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);
Ist es nun möglich die Beiden Abfragen zu einem Query zusammenzufassen?[/code]
__________________
MfG
derMaggus ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 14:36 Nach oben    #2
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

1. mysql kennt kein !=, es muss <> heißen.
2. muss ich erstmal überlegen
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 14:39 Nach oben    #3
Gruppenlos
 
Benutzerbild von derMaggus
 
Registriert seit: 24.08.2005
Beiträge: 26
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

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:
#

<> , !=

Not equal:

mysql> SELECT '.01' <> '0.01';
-> 1
mysql> SELECT .01 <> '0.01';
-> 0
mysql> SELECT 'zapp' <> 'zappp';
-> 1

Hier das Script in Aktion: http://www.shisha-guide.info/?seite=cafes&ID=3[/quote]
__________________
MfG
derMaggus ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 14:55 Nach oben    #4
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

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
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 15:55 Nach oben    #5
Gruppenlos
 
Benutzerbild von derMaggus
 
Registriert seit: 24.08.2005
Beiträge: 26
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

ich hab das Beispiel mal unvisell gemacht und einen Dump beigefügt, wer also testen mag...
__________________
MfG
derMaggus ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 16:24 Nach oben    #6
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

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
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 16:30 Nach oben    #7
Erfahrener Benutzer
 
Registriert seit: 19.08.2005
Beiträge: 115
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

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.
Buhmann ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 16:33 Nach oben    #8
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

Zitat:
Zitat von WarrenFaith
MySQL mag keine Select in Select
Kommt auf die MySQL-Version an

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:
<?php

    
require_once('./dbconfig.inc.php');
    
    
    if(
array_key_exists('cafe'$_GET) && is_numeric($_GET['cafe'])) {
        
         
$sql 'SELECT
                    *
                 FROM
                    %stest
                 WHERE
                    id = %s'
;
                   
        
$sql sprintf($sql_DB_TABLE_PREFIX$_GET['cafe']);
      
        
$res mysql_query($sql) or exit(mysql_error());
       
        
$obj mysql_fetch_object($res);
       
        echo 
'<pre>';
        
print_r($obj);
        echo 
'</pre>';    
       
       

        
$sql 'SELECT
                   *
                FROM
                   %stest
                WHERE             
                      ABS(%s - zip) < 50
                AND
                      %s != id'
;
            
        
$sql sprintf($sql_DB_TABLE_PREFIX$obj->zip$obj->id);
        
        
$res mysql_query($sql) or exit(mysql_error());
        
        echo 
'<ul>';
        
        while(
$obj mysql_fetch_object($res)) {
            
printf('<li><a href="%s?cafe=%s">%s %s</a></li>',
                   
$_SERVER['PHP_SELF'],
                   
$obj->id,
                   
$obj->zip,
                   
$obj->name);
        }      
        
        echo 
'</ul>';       
       
        
    }
    else {
        
        
$sql 'SELECT
                   *
                FROM
                   %stest'
;
        
        
$sql sprintf($sql_DB_TABLE_PREFIX);
        
        
$res mysql_query($sql) or exit(mysql_error());
        
        echo 
'<ul>';
        
        while(
$obj mysql_fetch_object($res)) {
            
printf('<li><a href="%s?cafe=%s">%s %s</a></li>',
                   
$_SERVER['PHP_SELF'],
                   
$obj->id,
                   
$obj->zip,
                   
$obj->name);
        }      
        
        echo 
'</ul>';
    }        
    
?>
Grüße Ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 16:35 Nach oben    #9
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

verdammt das klappt sogar
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 16:37 Nach oben    #10
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

Zitat:
Zitat von WarrenFaith
verdammt das klappt sogar
Irgendwie nicht wirklich ... oder ich wende die Anweisung von Buhmann nur falsch in meinem Script an .. muss das gerade nochmal testen. ..


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.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 16:54 Nach oben    #11
Erfahrener Benutzer
 
Registriert seit: 19.08.2005
Beiträge: 115
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

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
Der Code funktioniert so:
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|
+----+-----+----+-----+
Die ersten beiden Spalten sind einfach alle datensätze, die letzten beiden sind die daten von dem satz mit id = 3.
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.
Buhmann ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 17:04 Nach oben    #12
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

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
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 17:12 Nach oben    #13
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

Zitat:
Zitat von WarrenFaith
MySQL 4.0.24
Wie ich schon sagte ...

Zitat:
Starting with MySQL 4.1, all subquery forms and operations that the SQL standard requires are supported, as well as a few features that are MySQL-specific.

With MySQL versions prior to 4.1, it was necessary to work around or avoid the use of subqueries. In many cases, subqueries can successfully be rewritten using joins and other methods. See Section 13.2.8.11, “Rewriting Subqueries as Joins for Earlier MySQL Versions”.
http://dev.mysql.com/doc/mysql/en/subqueries.html

Grüße Ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 17:14 Nach oben    #14
Erfahrener Benutzer
 
Registriert seit: 19.08.2005
Beiträge: 115
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

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
Prinzip:
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|
+----+-----+--------------+
Es ist von der Geschwindigkeit wahrscheinlich nicht besser, da für jede spalte der zip wert der spalte mit id=$id sogar 2mal ausgelesen wird, anstatt nur einmal.
__________________
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.
Buhmann ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 17:17 Nach oben    #15
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

Yeah. Cool. Danke für die super Erklärungen

Fein.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.08.2005, 17:40 Nach oben    #16
Gruppenlos
 
Benutzerbild von derMaggus
 
Registriert seit: 24.08.2005
Beiträge: 26
Standard 2 Abfragen einer Tabelle zusammenfassen - JOIN?

herzlichen Dank an alle die sich beteiligt haben, ich bin MEHR als zufrieden!

Ziel erreicht- LIEBEN DANK!
__________________
MfG
derMaggus ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Tabelle, Überschrift, CSS (?) bacarni HTML, XML und CSS 12 10.08.2006 00:46
Welches Join soll ich verwenden? Chr!s Datenbanken 8 06.07.2006 12:33
mit LEFT OUTER JOIN mehr als 2 Tabellen verknüpfen ? Alpha Centauri Datenbanken 4 06.04.2006 19:00
MySQL: Abfrage aus zweiter Tabelle. Sebastian PHP-Programmierung 6 16.12.2005 00:01


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45