php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 30.05.2005, 18:29  
Erfahrener Benutzer
 
Registriert seit: 22.03.2005
Beiträge: 355
faux
faux eine Nachricht über ICQ schicken faux eine Nachricht über AIM schicken faux eine Nachricht über MSN schicken faux eine Nachricht über Yahoo! schicken
Standard Befehlsoptimierung

Hallo!

Bin gerade dabei einige MySQL-Anfragen zu überarbeiten (habe da etwas schlampig gearbeitet).

Habe das zur Zeit so:
Code:
SELECT `name` FROM `schiffe` WHERE `typ`=1 AND `klasse`=(SELECT `typ1` FROM `users` WHERE `id`=1 LIMIT 1) LIMIT 1;
SELECT `name` FROM `schiffe` WHERE `typ`=2 AND `klasse`=(SELECT `typ2` FROM `users` WHERE `id`=1 LIMIT 1) LIMIT 1;
SELECT `name` FROM `schiffe` WHERE `typ`=3 AND `klasse`=(SELECT `typ3` FROM `users` WHERE `id`=1 LIMIT 1) LIMIT 1;
SELECT `name` FROM `schiffe` WHERE `typ`=4 AND `klasse`=(SELECT `typ4` FROM `users` WHERE `id`=1 LIMIT 1) LIMIT 1;
SELECT `name` FROM `schiffe` WHERE `typ`=5 AND `klasse`=(SELECT `typ5` FROM `users` WHERE `id`=1 LIMIT 1) LIMIT 1;
SELECT `name` FROM `schiffe` WHERE `typ`=6 AND `klasse`=(SELECT `typ6` FROM `users` WHERE `id`=1 LIMIT 1) LIMIT 1;
SELECT `name` FROM `schiffe` WHERE `typ`=7 AND `klasse`=(SELECT `typ7` FROM `users` WHERE `id`=1 LIMIT 1) LIMIT 1;
SELECT `name` FROM `schiffe` WHERE `typ`=8 AND `klasse`=(SELECT `typ8` FROM `users` WHERE `id`=1 LIMIT 1) LIMIT 1;
SELECT `name` FROM `schiffe` WHERE `typ`=9 AND `klasse`=(SELECT `typ9` FROM `users` WHERE `id`=1 LIMIT 1) LIMIT 1;
Es wird also in einer Schleife alles zurgegangen (`typ`=$i und `typ$i`).
Das ist nicht optimal, weil es gilt ja so wenige Abfragen wie möglich.
Wie bringe ich das also in eine Abfrage?

EDIT:
Hab mir gerade gedacht, dass ich die Datenbank umdesignen sollte...
__________________
Wer weiß dass er nichts weiß, weiß mehr, als der der nicht weiß dass er nichts weiß.
www.e-faux.com
faux ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 30.05.2005, 19:46  
Gast
 
Beiträge: n/a
Standard

Vorschlag zum Testen:
Code:
SELECT
   s.name, s.typ, s.klasse,
   u.id
FROM
   schiffe AS s
LEFT JOIN users AS u
   ON (s.klasse IN (u.typ1, u.typ2, u.typ3, u.typ4, u.typ5, u.typ6, u.typ7, u.typ8, u.typ9))
      AND (u.id = 1)
WHERE
   u.id IS NOT NULL
   AND s.typ BETWEEN 1 AND 9
ORDER BY
   s.typ, s.klasse;
mfG ~dilemma~

ein Fundstück, passend zu deiner Signatur:

The Unknown

As we know,
There are known knowns.
There are things we know we know.
We also know
There are known unknowns.
That is to say
We know there are some things
We do not know.
But there are also unknown unknowns,
The ones we don't know
We don't know.
(—Feb. 12, 2002, Donald Rumsfeld / Department of Defense news briefing)
-----------------------------------------------------------------------
  Mit Zitat antworten
Alt 31.05.2005, 17:59  
Erfahrener Benutzer
 
Registriert seit: 22.03.2005
Beiträge: 355
faux
faux eine Nachricht über ICQ schicken faux eine Nachricht über AIM schicken faux eine Nachricht über MSN schicken faux eine Nachricht über Yahoo! schicken
Standard

Antwort, nein so gehts leider nicht.
Ich versuche jetzt seit einer Stunde herauszufinden, was JOIN macht, aber im Handbuch ist das etwas kompliziert...


Bei dem Code listet er nach der Reihe alle Schiffe mit dem Typ 1 bis 9 auf.
Code:
mysql> SELECT
    ->    s.name, s.typ, s.klasse,
    ->    u.id
    -> FROM
    ->    schiffe AS s
    -> LEFT JOIN users AS u
    ->    ON (s.klasse IN (u.typ1, u.typ2, u.typ3, u.typ4, u.typ5, u.typ6, u.typ7, u.typ8, u.typ9))
    ->       AND (u.id = 1)
    -> WHERE
    ->    u.id IS NOT NULL
    ->    AND s.typ BETWEEN 1 AND 9
    -> ORDER BY
    ->    s.typ, s.klasse;
+------------+-----+--------+------+
| name       | typ | klasse | id   |
+------------+-----+--------+------+
| Cope       |   1 |      1 |    1 |
| Zero       |   1 |      2 |    1 |
| Jing       |   1 |      3 |    1 |
| Staff      |   1 |      4 |    1 |
| Sugger     |   1 |      5 |    1 |
| Lilo       |   1 |      6 |    1 |
| Rezzer     |   1 |      7 |    1 |
| Bitter     |   1 |      8 |    1 |
| Hamma      |   1 |      9 |    1 |
| Flam       |   2 |      1 |    1 |
| Quiti      |   2 |      2 |    1 |
| Desperado  |   2 |      3 |    1 |
| Nimmerus   |   2 |      4 |    1 |
| Dabius     |   2 |      5 |    1 |
| Inkolupus  |   2 |      6 |    1 |
| Sisler     |   2 |      7 |    1 |
| Kanin      |   2 |      8 |    1 |
| Risi       |   2 |      9 |    1 |
| Assus      |   3 |      1 |    1 |
| Fell       |   3 |      2 |    1 |
| Remus      |   3 |      3 |    1 |
| Pastol     |   3 |      4 |    1 |
| Hust       |   3 |      5 |    1 |
| Hera       |   3 |      6 |    1 |
| Christo    |   3 |      7 |    1 |
| Valt       |   3 |      8 |    1 |
| Kamal      |   3 |      9 |    1 |
| Janna      |   4 |      1 |    1 |
| Selenzium  |   4 |      2 |    1 |
| Bananer    |   4 |      3 |    1 |
| Kisch      |   4 |      4 |    1 |
| Sumatra    |   4 |      5 |    1 |
| Wopper     |   4 |      6 |    1 |
| Gelere     |   4 |      7 |    1 |
| Wummer     |   4 |      8 |    1 |
| Aira       |   4 |      9 |    1 |
| Pflontsch  |   5 |      1 |    1 |
| Dempris    |   5 |      2 |    1 |
| Peklon     |   5 |      3 |    1 |
| Lemoto     |   5 |      4 |    1 |
| Quili      |   5 |      5 |    1 |
| Elek       |   5 |      6 |    1 |
| Sytex      |   5 |      7 |    1 |
| Systo      |   5 |      8 |    1 |
| Darik      |   5 |      9 |    1 |
| Ulir       |   6 |      1 |    1 |
| Miratus    |   6 |      2 |    1 |
| Urel       |   6 |      3 |    1 |
| Beturo     |   6 |      4 |    1 |
| Rilo       |   6 |      5 |    1 |
| Lomo       |   6 |      6 |    1 |
| Dementor   |   6 |      7 |    1 |
| Ílsa       |   6 |      8 |    1 |
| Petro      |   6 |      9 |    1 |
| Telor      |   7 |      1 |    1 |
| Usus       |   7 |      2 |    1 |
| Yuil       |   7 |      3 |    1 |
| Pfers      |   7 |      4 |    1 |
| Schiederus |   7 |      5 |    1 |
| Star       |   7 |      6 |    1 |
| Festor     |   7 |      7 |    1 |
| Desop      |   7 |      8 |    1 |
| P³tos      |   7 |      9 |    1 |
| Solper     |   8 |      1 |    1 |
| Tonardo    |   8 |      2 |    1 |
| Half       |   8 |      3 |    1 |
| Perantur   |   8 |      4 |    1 |
| Gurk       |   8 |      5 |    1 |
| Amada      |   8 |      6 |    1 |
| Mersy      |   8 |      7 |    1 |
| Wondra     |   8 |      8 |    1 |
| Multo      |   8 |      9 |    1 |
| Telum      |   9 |      1 |    1 |
| Olera      |   9 |      2 |    1 |
| Argen      |   9 |      3 |    1 |
| Umleur     |   9 |      4 |    1 |
| Herculem   |   9 |      5 |    1 |
| Globl      |   9 |      6 |    1 |
| Olav       |   9 |      7 |    1 |
| Stor       |   9 |      8 |    1 |
| Ultim      |   9 |      9 |    1 |
+------------+-----+--------+------+
81 rows in set (0.02 sec)
So sieht User 1 aus:
Code:
mysql> SELECT id, typ1, typ2, typ3, typ4, typ5, typ6, typ7, typ8, typ9 FROM users WHERE id=1;
+----+------+------+------+------+------+------+------+------+------+
| id | typ1 | typ2 | typ3 | typ4 | typ5 | typ6 | typ7 | typ8 | typ9 |
+----+------+------+------+------+------+------+------+------+------+
|  1 |    1 |    2 |    3 |    4 |    5 |    6 |    7 |    8 |    9 |
+----+------+------+------+------+------+------+------+------+------+
1 row in set (0.00 sec)
Nya, ich versuch mal JOIN zu kappieren, vielleicht kann ichs dann selbst...
Trotzdem Danke!

OT: Der Spruch ist cool... :P
__________________
Wer weiß dass er nichts weiß, weiß mehr, als der der nicht weiß dass er nichts weiß.
www.e-faux.com
faux ist offline   Mit Zitat antworten
Alt 31.05.2005, 18:20  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 2.039
Sclot befindet sich auf einem aufstrebenden Ast
Standard

erklärst du es mir bitte auch wenn du raus hast wie es funktioniert?
Sclot ist offline   Mit Zitat antworten
Alt 31.05.2005, 19:11  
Erfahrener Benutzer
 
Registriert seit: 22.03.2005
Beiträge: 355
faux
faux eine Nachricht über ICQ schicken faux eine Nachricht über AIM schicken faux eine Nachricht über MSN schicken faux eine Nachricht über Yahoo! schicken
Standard

Nya, ich kappier jetzt JOIN so in etwa. Ist eigentlich wie ein WHERE, nur dass es sich immer nur auf eine Spalte bezieht und nicht auf die ganze Abfrage, oder?

Ich hab sjetzt so gelöst:

Code:
SELECT `name`
FROM `schiffe`
WHERE (`typ`=1 AND `klasse`=(SELECT `typ1` FROM `users` WHERE `id`=1 LIMIT 1))
   OR (`typ`=2 AND `klasse`=(SELECT `typ2` FROM `users` WHERE `id`=1 LIMIT 1))
   OR (`typ`=3 AND `klasse`=(SELECT `typ3` FROM `users` WHERE `id`=1 LIMIT 1))
   OR (`typ`=4 AND `klasse`=(SELECT `typ4` FROM `users` WHERE `id`=1 LIMIT 1))
   OR (`typ`=5 AND `klasse`=(SELECT `typ5` FROM `users` WHERE `id`=1 LIMIT 1))
   OR (`typ`=6 AND `klasse`=(SELECT `typ6` FROM `users` WHERE `id`=1 LIMIT 1))
   OR (`typ`=7 AND `klasse`=(SELECT `typ7` FROM `users` WHERE `id`=1 LIMIT 1))
   OR (`typ`=8 AND `klasse`=(SELECT `typ8` FROM `users` WHERE `id`=1 LIMIT 1))
   OR (`typ`=9 AND `klasse`=(SELECT `typ9` FROM `users` WHERE `id`=1 LIMIT 1));
Wenn wem was besseres einfällt, bitte Posten.
1. Weil ich was draus lernen will und
2. Weil das nicht die optimale Lösung ist. Kommt sich ja fast auf das selbe wie die Schleife raus.

Danke schon mal.
__________________
Wer weiß dass er nichts weiß, weiß mehr, als der der nicht weiß dass er nichts weiß.
www.e-faux.com
faux ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
selenzium, typ neun schiff, was beteutet selenszium

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




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.