php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 12.02.2007, 17:46  
Erfahrener Benutzer
 
Registriert seit: 16.02.2006
Beiträge: 303
tinchen
Standard SQL und Join

Hallo ihr,

nach langer Zeit des "Wissens", mal wieder unwissend.

Kurz erklärt: Derzeit arbeite ich mit drei DB-Tabellen.
Events, Verantwortliche und eine Verknüpfung dieser beiden Tabellen.

Events: id | title | ...
Mods: id | surname | ...
Bridge: event_id | mod_id

Nun bastel ich mir eine Datenbankabfrage. Ich möchte alle Veranstaltungen ausgeben und wenn eine Verknüpfung besteht zusätzlich die Mods. Die Brigde ist eine 1:n Zuordung, da auch mehrere Mods zu einem Event gehören können.

Mein Select sieht so aus:

PHP-Code:
$query "SELECT e.*, m.*"
" FROM events AS e" 
" LEFT JOIN bridge AS b ON b.event_id = e.id"
" LEFT JOIN mods AS m ON b.mod_id = m.id"
" WHERE ...."
" GROUP BY e.id"
" ORDER BY eid"
" LIMIT $limitstart, $limit"

Obwohl ich zwei Datensätze in der events habe, wird mir nur ein Datensatz angezeigt. Nehme ich GROUP BY heraus habe ich drei, where habe ich auch schon komplett herausgeworfen, um mir einen Überblick zu verschaffen. Was ist dann nun los da? Liegt der Fehler schon in der Stuktur?

Grüße
Tine
tinchen ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 12.02.2007, 22:26  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

bist du sicher, dass die ID's unique sind und nicht tatsächlich ein doppelter eintrag in einer tabelle steht? oder hast du bereits 2 mods für ein event, dann wär es ja logisch, dass drei einträge existieren (2 unterscheiden sich dann in den mod feldern...) mal mit myadmin geschaut?
falls die datensätze wirklich in allen feldern identisch sind kannst du auch SELECT DISTINCT verwenden, obwohl es nicht die ursache des problems bekämpft.
nikosch ist offline   Mit Zitat antworten
Alt 12.02.2007, 23:01  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Eine 1:n Beziehung würde ich nicht mit einem JOIN machen, denn sonst hast du ja wie nikosch77 schon sagte, pro Mod eine Event-Zeile. Eigentlich willst du ja jeden Event nur einmal und dem zugeordnet x-beliebige Mods.
Dafür reichen 2 SQL-Queries.

Mein Vorschlag:
PHP-Code:
<?php
// alle Events abholen
$sSQL sprintf("SELECT * FROM events ORDER BY e.id LIMIT %u, %u"$limitstart$limit);
$rRes mysql_query($sSQL);
$aEvents = array();
while (
$aEvent mysql_fetch_assoc($rRes)) {
  
$iEventId $aEvent['id'];
  
$aEvents[$iEventId] = $aEvent;
}

// alle Mods, die Events zugeordnet wurden, die im vorherigen SQL-Statement vorkamen
$sSQL sprintf("SELECT m.*, b.* FROM bridge AS b INNER JOIN mods AS m ON m.id = b.mod_id WHERE b.event_id IN (%s)"implode(", "array_keys($aEvents)));
$rRes mysql_query($sSQL);
while (
$aMod mysql_fetch_assoc($rRes)) {
  
$iEventId $aMod['event_id'];
  
$aEvents[$iEventId]['mods'] = $aMod;
}

foreach (
$aEvents as $iEventId => $aEvent) {
  echo 
'<pre>'print_r($aEventtrue), '</pre>';
}
?>
Zergling-new ist offline   Mit Zitat antworten
Alt 13.02.2007, 12:21  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Ich denke, das Problem liegt nicht in der Struktur, sondern in den Daten. Der Sinn der Normalisierung ist ja, dass du keine Daten doppelt speicherst. Das tust du aber, wenn du das gleiche Event zweimal in der Tabelle hast. Stattdessen soll das Event nur einmal in der Tabelle stehen und zwei Einträge in der Bridge. Hier ein Beispiel:
Events:
  • A | .....
    B | .....
    D | .....
    X | .....

Mods:
  • 1 | .....
    2 | .....
    5 | .....

Bridge:
  • A | 1
    B | 1
    B | 5
    D | 5
    X | 1
    X | 2

Wenn du nun die Abfrage:
Code:
SELECT
    e.id,
    e.title,
    m.id,
    e.name
FROM
    events e
INNER JOIN
    bridge b ON e.id = b.event_id
INNER JOIN
    mods m ON b.mod_id = m.id
ORDER BY
    e.id
ausführst, wirst du die entsprechenden Daten erhalten.
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 13.02.2007, 14:23  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

@lazydog:
hat doch niemand behauptet, dass ausser in der bridge daten doppelt auftauchen. und der INNER JOIN führt dazu, dass kein datendsatz auftaucht, wenn die mod-komponente nicht definiert ist. denke nicht, dass das so gewollt ist.
nikosch ist offline   Mit Zitat antworten
Alt 13.02.2007, 15:08  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zitat:
Zitat von nikosch77
@lazydog:
hat doch niemand behauptet, dass ausser in der bridge daten doppelt auftauchen.
Ich bin dann auch davon ausgegangen, dass Events nur einmalig in der Events-Tabelle stehen, aber der letzte Absatz von Tinchen könnte auch aussagen, dass in der Events-Tabelle der selbe Event möglicherweise mehrfach auftaucht (pro Mod einer?).
Oder ist das nur der Seiteneffekt von LEFT JOIN?

Warten wir mal ab was sie dazu sagt.
Zergling-new ist offline   Mit Zitat antworten
Alt 18.02.2007, 15:53  
Erfahrener Benutzer
 
Registriert seit: 16.02.2006
Beiträge: 303
tinchen
Standard

Hallo zusammen,

natürlich tauchen die Datensätze in der events nur einmal auf, es sei denn sie würden kopiert werden, was auch möglich ist, aber dann wird durch die id natürlich eindeutig unterschieden.

Ich habe es nun auch irgendwie hingefummelt, auch wenn ich mir nicht ganz sicher bin, ob das richtig ist was ich getan habe. Sagen wir so, es funktioniert wie es soll, aber es gut ist lass ich mach dahingestellt.

@Zergling: Ich habe lange mit deinem Code experimentiert, aber das hat mir nicht so recht gelingen wollen, da ich zusätzlich auch die mods-Abfrage im ersten Query brauche, da ich im Frontend auch nach Veranstaltungen und Mods sortieren kann.

Das ist alles noch nicht optimal - mal sehen, was mir im Laufe der Zeit noch dazu einfällt. Zunächst aber vielen Dank für die großzügige Unterstützung.

Grüße
Tine
tinchen 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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mehrfach Join lazydog Datenbanken 2 08.05.2008 16:09
JOIN Problem pPanther Datenbanken 7 06.03.2008 17:26
[gelöst]LEFT JOIN, DINSTINCT und trotzdem doppelte?!?! stefanjann Datenbanken 10 06.02.2008 11:49
JOIN / LEFT JOIN und Co prinzli Datenbanken 12 05.11.2007 22:15
Komplexes Join Problem pPanther Datenbanken 7 03.08.2007 23:16
[solved] LEFT JOIN - #1066 - Not unique table/alias moose Datenbanken 6 12.12.2006 06:41
SQL-Frage zum JOIN micbur Datenbanken 2 16.11.2006 23:46
SQL-Abfrage evt. mit JOIN mariohaehni Datenbanken 4 07.09.2006 14:26
Join auf 2 verschiedene Felder Tommek Datenbanken 6 25.07.2006 20:39
JOIN problem 2 tabellen - zeile(tab1) zu spalte(tab2) Ministry Datenbanken 7 31.05.2006 10:31
Problem mit Inner join Jabi Datenbanken 15 09.05.2006 14:10
INNER JOIN + Suchkriterien + Abfrage duerov PHP Tipps 2006 4 04.04.2006 12:47
inner join aus db PHP Tipps 2006 8 22.01.2006 01:23
Select Problem Datenbanken 17 16.01.2006 21:54
[Erledigt] Abfrageproblem mit Inner Join Datenbanken 15 29.11.2005 18:17

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
where und join, event join php, sql bridge php, \bridge join sql

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:51 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.