PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL-Query.......gehts besser ?



breaker
06.05.2008, 00:07
Eventuell ist ja jemand besser in Sachen Mysql und kann mir sagen, ob es eine bessere Methode gibt, um aus 1 Tabelle alle Datensätze und aus 3 weiteren Tabellen eventuelle Übereinstimmungen auszulesen


In der 1. Tabelle stehen alle Datensätze, die 2-4 Tabelle kann für jeden Datensatz zutreffen, ist das der Fall, werden zusätzliche Funktionen aktiviert.

Wies sieht es also aus....läßt sich diese Query noch verbessern ?



$sql1 = sql_query("SELECT
paidmails.*,
gebucht.k_code AS mail_gebucht,
black.k_code AS mail_black,
reload.k_reload AS mail_reload_reload
FROM " . $prefix . _DB_TABLE_PWC_PM . " AS paidmails
LEFT JOIN " . $prefix . _DB_TABLE_PWC_PM_GEBUCHT . " AS gebucht
ON (paidmails.k_code = gebucht.k_code)
LEFT JOIN " . $prefix . _DB_TABLE_PWC_PM_BLACKLISTE . " AS black
ON (paidmails.k_code = black.k_code)
LEFT JOIN " . $prefix . _DB_TABLE_PWC_PM_RELOAD . " AS reload
ON (paidmails.k_code = reload.k_code)
WHERE paidmails.k_sponsor = 12
AND paidmails.k_art = $k_art
ORDER BY paidmails.k_ver DESC
");

Gremlin
06.05.2008, 00:34
Wie schaut es mit der Indizierung der Tabellen aus? Sind die dort entsprechend gesetzt?

Gruß
Gremlin

breaker
06.05.2008, 00:52
Wie schaut es mit der Indizierung der Tabellen aus? Sind die dort entsprechend gesetzt?

Gruß
Gremlin

Hab ich vergessen zu erwähnen ;)

Jede Tabelle besitzt ein Feld "k_code" welches Unique ist, der Wert für "k_code" kommt also immer nur 1 x pro Tabelle vor, wobei 1 "k_code" auch in jeder Tabelle vorkommen kann ;)

Benutzer1699
10.05.2008, 23:54
Ach ja, hier wollte ich ja auch mal meinen Senf zu geben, hoffentlich schmeckts - gibt nachher auch Bratwürstchen dazu :D

Folgenden Code einfach mal in einem Query-Browser (mysql,phpMyAdmin...) ausführen.


EXPLAIN
SELECT
paidmails.*,
gebucht.k_code AS mail_gebucht,
black.k_code AS mail_black,
reload.k_reload AS mail_reload_reload
FROM " . $prefix . _DB_TABLE_PWC_PM . " AS paidmails
LEFT JOIN " . $prefix . _DB_TABLE_PWC_PM_GEBUCHT . " AS gebucht
ON (paidmails.k_code = gebucht.k_code)
LEFT JOIN " . $prefix . _DB_TABLE_PWC_PM_BLACKLISTE . " AS black
ON (paidmails.k_code = black.k_code)
LEFT JOIN " . $prefix . _DB_TABLE_PWC_PM_RELOAD . " AS reload
ON (paidmails.k_code = reload.k_code)
WHERE paidmails.k_sponsor = 12
AND paidmails.k_art = $k_art
ORDER BY paidmails.k_ver DESC


Mehr dazu (http://dev.mysql.com/doc/refman/5.1/de/explain.html)

breaker
11.05.2008, 03:15
MySQL 5.1.5......das ganze muss leider auch auf v4.3xx oder höher laufen ;)

Benutzer1699
11.05.2008, 05:20
hehe, natürlich geht das auch unter MySQL 4.1 (http://dev.mysql.com/doc/refman/4.1/en/explain.html).

MySQL 4.3? Hab ich bislang nichts von gehört, oder meinst du PHP 4.3.x?
Explain hat mit PHP nichts zu tun und hilft dir lediglich den Query zu analysieren.

Notfalls kannst du die Datenbank lokal in einer Umgebung mit den entsprechenden Versionen testen, sollte aber nicht notwendig sein, da EXPLAIN ja mit 4.1 funktioniert.

breaker
11.06.2008, 01:55
hehe, natürlich geht das auch unter MySQL 4.1 (http://dev.mysql.com/doc/refman/4.1/en/explain.html).

MySQL 4.3? Hab ich bislang nichts von gehört, oder meinst du PHP 4.3.x?
Explain hat mit PHP nichts zu tun und hilft dir lediglich den Query zu analysieren.

Notfalls kannst du die Datenbank lokal in einer Umgebung mit den entsprechenden Versionen testen, sollte aber nicht notwendig sein, da EXPLAIN ja mit 4.1 funktioniert.

Funktioniert nur mit left/right/inner/outer join nicht ;)

Das ganze wird aber gerade als Klasse umgebaut, das spart mir bei (inzwischen 34 Netzwerken) ca 1 MB Code :)

Benutzer1699
11.06.2008, 03:01
mist :D
Aber Glückwunsch, dass du eine Lösung gefunden hast.