ilch Forum » Allgemein » HTML, PHP, SQL,... » Mehrere Datenbankabfragen (vereinfachen)

Geschlossen
  1. #1
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Ich wollte einmal fragen wie ich mehrere Tabellenabfrage in einer Abfrage vereinen kann, sodass ich am ende nur eine Variable habe und mit dieser dann weiter arbeiten kann.

    Denn im Prinzip muss man ja beachten das manche Tabellen gleiche Zellennamen besitzen können.
    0 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    boehserdavid Mitglied
    Registriert seit
    26.08.2006
    Beiträge
    2.122
    Beitragswertungen
    2 Beitragspunkte
    Hey, Cartment!

    Schwer zu sagen ohne Abfragen, aber vielleicht hift das ja schon.

    "SELECT table.field, table2.field FROM table LEFT JOIN table2 on table.field2 = table2.field2"

    Mit böhsen Grüßen
    BöhserDavid
    -Heute schon böhse gewesen?- Ab zur Community
    -No Support via Contact-
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Wenn ich verstehe wie ist das kein Problem.
    Also soweit ich verstanden habe:

    Der Selektiert von der Tabelle table das Feld field
    und aus der zweiten Tabelle table2 das Feld field.


    Ich hab ja nicht vor mri jetzt irgendwas andauernd machen zu lassen sondern Frage lieber nach wie etwas geht damit ich das dann auch verstehe und nihct dutzende male Fragen muss.

    Also ich verstehe nicht ab dem Left Join was das andere da bedeutet.
    0 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Naja es muss auch irgendein Sinn machen die Abfrage zu vereinigen, in diesem Fall werden die Tabellen halt über das field2 der jeweiligen Tabellen vereinigt.

    Beispiel

    table1
    field 1   |   field2
    ---------------------
    1           |      2
    2           |      3
    3           |      3
    
    table2
    field 1   |   field2
    ---------------------
    ja          |      1
    nein      |      2
    oder      |      3


    Dann wird halt über das field2 vereinigt. Dann würde als Ergebnis rauskommen.
    table.field   |   table2.field
    --------------------------------
    1                 |     nein
    2                 |     oder
    3                 |     oder


    Ich hoffe, ich hab mich nicht vertan.
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Soweit ich verstanden habe
    das der aus table flied und aus table2 field selektiert.
    Dann kommt der weiter von table, aber was bedeutet jetzt Left Join
    0 Mitglieder finden den Beitrag gut.
  6. #6
    User Pic
    boehserdavid Mitglied
    Registriert seit
    26.08.2006
    Beiträge
    2.122
    Beitragswertungen
    2 Beitragspunkte
    aktuelle table verlassen und table2 als aktuell setzen, damit man die Daten lesen kann.

    Und dann kommt die Auswahl von wegen ich will das tabel2.field haben welches table.field2 == table2.field2
    ist.

    Natürlich muss da unter Umständen noch ein WHERE table.field = $foo AND tabel2.field2 = $bar
    -Heute schon böhse gewesen?- Ab zur Community
    -No Support via Contact-
    0 Mitglieder finden den Beitrag gut.
  7. #7
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Ich habe genau die SQL Abfrage von boehserdavid "ausgeführt", naja LEFT JOIN in Worten,
    Nimm alles von link und füge, wenn vorhanden, das rechte an, sonst NULL, wobei bei dem LEFT JOIN aber halt eine Bedingung mitgegeben wird, welches Feld denn nun hinzugefügt wird, bzw. es können auch mehrere Zeilen hinzugefügt werden, naja irgendwie ist das schlecht zu erklären zunge
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  8. #8
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Was ich noch nicht verstanden habe ist, warum field2 benutzt wird obwohl links nicht davon gefragt wird.
    0 Mitglieder finden den Beitrag gut.
  9. #9
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Warum? Es ist in der SQL Abfrage definiert, und die schreibt der Programmierer, also über welche Spalten "gejoint" wird bestimmt er selbst.
    Diese Spalten müssen auch nicht gleich heißen, es muss auch nicht == sein oder es können mehrere Bedingungen bzw. Felder herangezogen werden dafür.
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  10. #10
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Weilm ich verstehe es bisher so das er aus table das field holt und aus table 2 auch das field. nun ist die Frage, woher kommt dann field 2
    0 Mitglieder finden den Beitrag gut.
  11. #11
    User Pic
    boehserdavid Mitglied
    Registriert seit
    26.08.2006
    Beiträge
    2.122
    Beitragswertungen
    2 Beitragspunkte
    Um zu wissen von welchem Datensatz field in table2 geholt werden soll, muss ie Abfrage doch wissen, WAS BEDINGUNG ist.

    Oder du schaust dir mal die memb_list.php an dort wird aus der Table grundrechte das Grundrecht als Name geholt in Bezug auf die ID die in der Table user Field recht steht.

    *EDIT:
    Umständlich
    array = SELECT recht,name FROM prefix_user WHERE name = 'test'
    recht_als_name = SELECT name FROM prefix_grundrechte WHERE id = array[recht]

    Einfach
    array = SELECT grundrechte.name, user.name FROM prefix_user LEFT JOIN grundrechte ON user.recht = grundrechte.id WHERE user.name = 'test'
    Heißt:
    Ich will den Namen aus USER und den Namen des Grundrechtes des User aus GRUNDRECHTE, aber woher weiß die Abfrage denn wie der Name des Rechtes lautet? Gar nicht also muss ich der Abfrage mit
    LEFT JOIN grundrechte ON user.recht = grundrechte.id
    sagen das die Zahl USER.RECHT = der ID des GRUNDRECHTES entspricht.

    jetzt klar?


    Zuletzt modifiziert von boehserdavid am 01.08.2008 - 21:12:15
    -Heute schon böhse gewesen?- Ab zur Community
    -No Support via Contact-
    0 Mitglieder finden den Beitrag gut.
  12. #12
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Meien Interpretation.
    Am Anfang selektiert er aus der tabelle grundrechte alle namen und aus der tabelle user alle namen.
    1. Frage, warum steht dannd a nur prefix_user und wo bleibt prefix_grundrechte.
    Danach vergleicht er die Rechte ID aus der der Tabelle User mit der ID aus Grundrechte. Allerdings mit dem Faktor, wo der name in der tabelle test ist.
    2. Logischerweise kann ich das doch dann auch mit Where Session ID machen?
    0 Mitglieder finden den Beitrag gut.
  13. #13
    User Pic
    boehserdavid Mitglied
    Registriert seit
    26.08.2006
    Beiträge
    2.122
    Beitragswertungen
    2 Beitragspunkte
    1. Man kann nur in einer Tabelle zur selben Zeit arbeiten deswegen LEFT JOIN (verlassen aintreten).

    2. Ja, du kannst aber auch das WHERE weg lassen und das genze in einer Schleife ausgeben, es wird ja nur einen Datensatz zur selben Zeit verarbeitet, bei solchen Abfragen. Im Cache ( mysql_query() ) liegen alle Datensätze, die mit der Abfrage übereinstimmen.
    -Heute schon böhse gewesen?- Ab zur Community
    -No Support via Contact-
    0 Mitglieder finden den Beitrag gut.
  14. #14
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Kleine korrektur, LEFT JOIN bedeutet eher links anfügen, allerdings bedeutet das nicht links anfügen, sondern an das linke anfügen, also es wird erst das Linke beachtet und dann das rechte angefügt, es gibt dann z.B. noch INNER JOIN, wobei nur Übereinstimmungen aneinandergefügt werden.

    Naja ok, wird eh keiner verstehen, deswegen hör ich auf zwinker
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  15. #15
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Aslo erst mal, dieses Thema gefällt mir, hier kann jeder mal was lernen.
    So aber weiter.
    Vor ich jetzt noch dutzende von themen schreibe wäre es glaube einafcher wenn ihr mir Schritt für Schritt das Teil heir erklärt:
    array = SELECT grundrechte.name, user.name FROM prefix_user LEFT JOIN grundrechte ON user.recht = grundrechte.id WHERE user.name = 'test'


    Das wäre glaube am einfachsten. Da ich immer nur Teile verstehe.

    Edit:

    bedeutet grundrechte.name, user.name das
    Grundrechte gleich die Tabelle und Name = die Spalte oder wie.(tabelle.spalte)
    Und warum steht da nur grundrechte und nicht prefix_grundrechte ist das ein Fehler oder warum ist das so


    Zuletzt modifiziert von Cartment am 01.08.2008 - 23:28:18
    0 Mitglieder finden den Beitrag gut.
  16. #16
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Ja das ist das Schema tabelle.feld und er wird einfach nur nicht soviel schreiben haben wollen.
    Man kann das nur anhand von Tabellen erklären, dieses lassen sich allerdings schlecht darstellen.

    Aber ok nehmen wir nochmal die Grundrechte und eine vereinfachte Usertabelle.

    Recht
    
    id 	| name
    ----------------
    0 	| Gast
    -1 	| User
    -2 	| Superuser
    -3 	| Trialmember
    -4 	| Member
    -5 	| CoLeader
    -6 	| Leader
    -7 	| SiteAdmin
    -8 	| CoAdmin
    -9 	| Admin
    
    und 
    
    User
    
    id  | name   |  recht
    ---------------------
    1   | Hans   |  -9
    2   | Klaus  |  -3
    3   | Susi   |  -3
    4   | Peter  |  -1
    5   | Fehler |   3


    So die Tabellen heißen jetzt eben vereinfacht Recht und User.
    Die Abfrage von oben auf diese Tabellen angepasst wäre dann.
    SELECT User.name, Recht.name AS recht FROM User LEFT JOIN Recht ON User.recht = Recht.id


    Also habe ich im Ergebnis nur die in SELECT stehenden Spalten, das AS habe ich eingefügt, da 2 mal name eigentlich nicht geht.
    Das LEFT JOIN bewirkt jetzt , das aus der User Tabelle ausgelesen wird und dann nach der Bedingung ein (unter Umständen auch mehrere) Datensatz aus der Recht Tabelle hinzugefügt werden.

    User LEFT JOIN recht ON User.recht = Recht.id
    User.id | User.name | User.recht | Recht.id | Recht.name
    --------------------------------------------------------
    1       | Hans      |  -9        | -9 	    | Admin       
    2       | Klaus     |  -3        | -3 	    | Trialmember
    3       | Susi      |  -3        | -3 	    | Trialmember
    4       | Peter     |  -1        | -1 	    | User
    5       | Fehler    |   3        | NULL     | NULL


    So daran kannst du ja sehen, das immer User.recht und Recht.id gleich sind, wie es eben in der Bedingung steht, bei Fehler ist es halt so, dass es keinen solchen Datensatz in der Recht Tabelle gibt, deswegen wird mit NULL aufgefüllt.
    Bereinigt auf die SQL Abfrage wäre das Ergebnis halt
    name      | recht
    -----------------------
    Hans      | Admin       
    Klaus     | Trialmember
    Susi      | Trialmember
    Peter     | User
    Fehler    | NULL


    So genug geschrieben, wenns jetzt nicht klar geworden ist kann ich es auch nicht ändern zunge

    PS: Ach und der Grund warum ich den Fehler noch eingebunden hatte, war dass ich noch INNER JOIN mit einbringen wollte, da würde der letzte Datensatz im Ergebnis wegfallen, das da nicht einfach Links genommen wird und das Rechts angefügt wird, sondern nur wenn es wirklich auch Links und Rechts gibt, was bei Fehler nicht der Fall wäre, da würde dieser Datensatz wegfallen.


    Zuletzt modifiziert von Mairu am 02.08.2008 - 08:09:32
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  17. #17
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Letzet beiden Fragen woran ich monetan hänge
    1.Bei User.name bedeutet das User vor dem Punkt die Tabelle und der name nachd em Punkt der Spalten Name, Oder?
    2.Muss das nicht bei ilch auf beiden Seiten prefix_user und prefix_recht lauten. Zwar hast du es vereinafcht aber davor wurde das prefix bei Grundrechte immer weggelassen.
    0 Mitglieder finden den Beitrag gut.
  18. #18
    User Pic
    boehserdavid Mitglied
    Registriert seit
    26.08.2006
    Beiträge
    2.122
    Beitragswertungen
    2 Beitragspunkte
    1. Ja. table.field == user.name

    2. Ja, bei Ilch muss das schon prefix_user heißen, aber das kannst du nicht verallgemeinern. Wenn du jetzt selber Tabellen anlegst nennet du sie ja so wie du es willst, und dann kann die eigentliche User Table auch asde32FAF heißen.
    -Heute schon böhse gewesen?- Ab zur Community
    -No Support via Contact-
    0 Mitglieder finden den Beitrag gut.
  19. #19
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Ah danke.
    Und wie wäre dasw jetzt wenn ich nur aus 3 verschiedenen Tabellen ein Namen abfragen will. Und wie kann ich dann nun aus drei verschiedenen Tabellen die die gleichen spalten Namen besitzen diese einzel und geordnet ausgeben.

    Jetzt habe ich bereits verstanden und Erfolgreich eingesetzt
    0 Mitglieder finden den Beitrag gut.
  20. #20
    User Pic
    boehserdavid Mitglied
    Registriert seit
    26.08.2006
    Beiträge
    2.122
    Beitragswertungen
    2 Beitragspunkte
    Zu Mairus BSP kommt noch bei User das Feld
    spezrank
    hinzu

    User
    Table User
    
    id  | name   |  recht  | spezrank
    --------------------------------------
    1   | Hans   |  -9     |  4
    2   | Klaus  |  -3     |  3
    3   | Susi   |  -3      |  2
    4   | Peter  |  -1     |  5
    5   | Fehler |   3     |  1
    
    Table spezrank
    
    User
    
    id  | name   
    ---------------
    1   | Anfänger
    2   | Erklärer
    3   | Aufpasser
    4   | Moderator
    5   | Forenadmin


    SELECT User.name, Recht.name AS recht, spezrank.name AS Spezialrang FROM User LEFT JOIN Recht ON User.recht = Recht.id LEFRT JOIN spezrank ON user.spezrank = spezrank.id
    --------------------------------------------------------
    1       | Hans      |  -9        | -9         | Admin            | 4 |   Moderator 
    2       | Klaus     |  -3        | -3         | Trialmember   | 3 | Aufpasser
    3       | Susi      |  -3        | -3         | Trialmember
    4       | Peter     |  -1        | -1         | User
    5       | Fehler    |   3        | NULL     | NULL


    Einfach das entspechende Feld aus der nächsten Tabelle in der Abfrage nach SELECT einfügen und wieder mit LEFT JOIN anfügen.

    So werden übrigens auch Suchanfragen kombiniert und so hab ich das auch schonmal für eine Suche gecodet, aber da waren da 15 Tabellen die angefügt wurden-.
    -Heute schon böhse gewesen?- Ab zur Community
    -No Support via Contact-
    0 Mitglieder finden den Beitrag gut.
  21. #21
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Also dann wäre das so.
    $erg = db_query("SELECT tabelle1.name, tabelle2.name, tabelle3.name Form `tabelle1` LEFT JOIN `tabelle2` LEFT JOIN `tabelle3`");
    $row = db_fetch_assoc($erg);
    
    echo $erg['name'].;


    Nun ist die Frage wie ich das jetzt hier ausgebe. Name geht ja nicht da es ja insgesamt drei mal name gibt. Müsste ich dann anstatt name vielleicht tabelle1.name eintragen?
    0 Mitglieder finden den Beitrag gut.
  22. #22
    User Pic
    assault Hall Of Fame
    Registriert seit
    03.11.2006
    Beiträge
    2.925
    Beitragswertungen
    1 Beitragspunkte
    du kannst auch tabelle1.name as name1 schreiben dann ist name1 später der Spaltenkey im array.
    0 Mitglieder finden den Beitrag gut.
  23. #23
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Ok danke.
    SELECT tabelle1.name as tb1name,

    also dürfte das so ungefähr aussehen?
    0 Mitglieder finden den Beitrag gut.
  24. #24
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Ja und wenn du die Beispiele genau angeschaut hättest, dann hätte dir das auch schon auffallen sollen.
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  25. #25
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Und wie sieht es mit where aus, da ich zwei Where abfragen benötige. Könnte ich das so machen

    $name=@db_result(db_query('SELECT name FROM prefix_user id='.$row->uid.'WHERE recht="-3"'),0);


    oder wie soll das von statten gehen. Sorry wenn ihr langsam ein nevriges verlangen bekommt, ich frag halt nur


    Zuletzt modifiziert von Cartment am 14.08.2008 - 20:44:56
    0 Mitglieder finden den Beitrag gut.
  26. #26
    User Pic
    boehserdavid Mitglied
    Registriert seit
    26.08.2006
    Beiträge
    2.122
    Beitragswertungen
    2 Beitragspunkte
    So langsam wirds wirklich nervig.
    Schau dir doch andere PHP Dateien an.

    WHERE id = 25 AND abc = def AND xyz != 24
    -Heute schon böhse gewesen?- Ab zur Community
    -No Support via Contact-
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu HTML, PHP, SQL,...

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten