CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
08.06.2008, 18:43:30
|
Anfänger
|
|
Registriert seit: Jun 2008
Alter: 44
Beiträge: 6
|
|
"Verschachtelte" Selects über 3 Tabellen
Hi,
ich habe folgende Tabellen. Ich geb mal die komplette Create und inserts mit, damit sich das vielleicht jemand nachbauen kann ;-)
Code:
DROP TABLE IF EXISTS `spieler`;
CREATE TABLE IF NOT EXISTS `spieler` (
`id` int(3) NOT NULL,
`uid` varchar(10) collate utf8_unicode_ci NOT NULL,
`name` varchar(30) collate utf8_unicode_ci NOT NULL,
`vorname` varchar(30) collate utf8_unicode_ci NOT NULL,
`pic` varchar(80) collate utf8_unicode_ci default NULL,
`pic_thumb` varchar(80) collate utf8_unicode_ci default NULL,
`beschreibung1` varchar(300) collate utf8_unicode_ci default NULL,
`beschreibung2` varchar(300) collate utf8_unicode_ci default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Daten für Tabelle `spieler`
--
INSERT INTO `spieler` (`id`, `uid`, `name`, `vorname`, `pic`, `pic_thumb`, `beschreibung1`, `beschreibung2`) VALUES
(1, 'hahn_c', 'Hahn', 'Christopher', '/images/spieler/christopher_hahn.jpg', '/images/spieler/thumbs/christopher_hahn.jpg', '', '');
INSERT INTO `spieler` (`id`, `uid`, `name`, `vorname`, `pic`, `pic_thumb`, `beschreibung1`, `beschreibung2`) VALUES
(2, 'hahn_m', 'Hahn', 'Matthias', '/images/spieler/defaultUser.jpg', '/images/spieler/thumbs/matthias_hahn.jpg', '', '');
INSERT INTO `spieler` (`id`, `uid`, `name`, `vorname`, `pic`, `pic_thumb`, `beschreibung1`, `beschreibung2`) VALUES
(3, 'goetz_h', 'Götz', 'Hans', '/images/spieler/hans_goetz.jpg', '/images/spieler/thumbs/hans_goetz.jpg', '', '');
INSERT INTO `spieler` (`id`, `uid`, `name`, `vorname`, `pic`, `pic_thumb`, `beschreibung1`, `beschreibung2`) VALUES
(4, 'ruediger_b', 'Berndt', 'Rüdiger', '/images/spieler/ruediger_berndt.jpg', '/images/spieler/thumbs/ruediger_berndt.jpg', '', '');
INSERT INTO `spieler` (`id`, `uid`, `name`, `vorname`, `pic`, `pic_thumb`, `beschreibung1`, `beschreibung2`) VALUES
(5, 'david_k', 'Komma', 'David', '/images/spieler/david_komma.jpg', '/images/spieler/thumbs/david_komma.jpg', '', '');
INSERT INTO `spieler` (`id`, `uid`, `name`, `vorname`, `pic`, `pic_thumb`, `beschreibung1`, `beschreibung2`) VALUES
(6, 'bernd_s', 'Schulz', 'Bernd', '/images/spieler/bernd_schulz.jpg', '/images/spieler/thumbs/bernd_schulz.jpg', '');
INSERT INTO `spieler` (`id`, `uid`, `name`, `vorname`, `pic`, `pic_thumb`, `beschreibung1`, `beschreibung2`) VALUES
(7, 'philip_w', 'Wurzberger', 'Philip', '/images/spieler/philip_wurzberger.jpg', '/images/spieler/thumbs/philip_wurzberger.jpg', '', '');
DROP TABLE IF EXISTS `aufstellung`;
CREATE TABLE IF NOT EXISTS `aufstellung` (
`id` int(3) NOT NULL,
`auf_spieler_id` int(3) NOT NULL REFERENCES spieler(id),
`saison` int(6) default NULL,
`geschlecht` varchar(1) collate utf8_unicode_ci default NULL,
`runde` varchar(2) collate utf8_unicode_ci default NULL,
`mannschaft` int(1) default NULL,
`position` int(2) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Daten für Tabelle `aufstellung`
--
INSERT INTO `aufstellung` (`id`, `auf_spieler_id`, `saison`, `geschlecht`, `runde`, `mannschaft`, `position`) VALUES
(1, 1, 200809, 'h', 'vr', 1, 1);
INSERT INTO `aufstellung` (`id`, `auf_spieler_id`, `saison`, `geschlecht`, `runde`, `mannschaft`, `position`) VALUES
(2, 2, 200809, 'h', 'vr', 1, 2);
INSERT INTO `aufstellung` (`id`, `auf_spieler_id`, `saison`, `geschlecht`, `runde`, `mannschaft`, `position`) VALUES
(3, 3, 200809, 'h', 'vr', 1, 3);
INSERT INTO `aufstellung` (`id`, `auf_spieler_id`, `saison`, `geschlecht`, `runde`, `mannschaft`, `position`) VALUES
(4, 4, 200809, 'h', 'vr', 1, 4);
INSERT INTO `aufstellung` (`id`, `auf_spieler_id`, `saison`, `geschlecht`, `runde`, `mannschaft`, `position`) VALUES
(5, 5, 200809, 'h', 'vr', 1, 5);
INSERT INTO `aufstellung` (`id`, `auf_spieler_id`, `saison`, `geschlecht`, `runde`, `mannschaft`, `position`) VALUES
(6, 6, 200809, 'h', 'vr', 1, 6);
INSERT INTO `aufstellung` (`id`, `auf_spieler_id`, `saison`, `geschlecht`, `runde`, `mannschaft`, `position`) VALUES
(7, 7, 200809, 'h', 'vr', 1, 7);
DROP TABLE IF EXISTS `bilanzen`;
CREATE TABLE IF NOT EXISTS `bilanzen` (
`id` int(3) NOT NULL auto_increment,
`bil_spieler_id` int(3) NOT NULL REFERENCES spieler(id),
`saison_clicktt` varchar(10) collate utf8_unicode_ci default NULL,
`person_clicktt` varchar(8) collate utf8_unicode_ci default NULL,
`clubnr_clicktt` varchar(4) collate utf8_unicode_ci default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Daten für Tabelle `bilanzen`
--
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(1, '2007%2F08', '366147', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(1, '2006%2F07', '366147', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(1, '2005%2F06', '366147', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(2, '2007%2F08', '381117', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(2, '2006%2F07', '381117', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(2, '2005%2F06', '381117', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(3, '2007%2F08', '367153', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(3, '2006%2F07', '367153', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(3, '2005%2F06', '367153', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(4, '2007%2F08', '386335', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(4, '2006%2F07', '386335', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(4, '2005%2F06', '386335', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(5, '2007%2F08', '381117', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(5, '2006%2F07', '381117', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(5, '2005%2F06', '381117', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(6, '2007%2F08', '702712', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(6, '2006%2F07', '702712', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(6, '2005%2F06', '702712', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(7, '2007%2F08', '370636', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(7, '2006%2F07', '370636', '4169');
INSERT INTO `bilanzen` (`bil_spieler_id`, `saison_clicktt`, `person_clicktt`, `clubnr_clicktt`) VALUES
(7, '2005%2F06', '370636', '4169');
So.
Was ich nun will ist einmal alle Spieler mit ihrer Aufstellung: 1:1 Beziehung. Die hole ich über
Code:
$result = mysql_query('
SELECT
*
FROM
spieler s, aufstellung a
WHERE
s.id=a.auf_spieler_id
AND a.mannschaft = '.$mannschaft.'
AND a.geschlecht = "'.$geschlecht.'"
AND a.saison = "'.$saison.'"
AND a.runde = "'.$runde.'"
;') OR die(mysql_error());
Was ich aber noch brauche sind alle Bilanzen des jeweiligen Spielers.
Code:
$result_b = mysql_query('
SELECT b.saison_clicktt, b.person_clicktt, b.clubnr_clicktt, b.bil_spieler_id
FROM bilanzen b
LEFT JOIN spieler s
USING ( id )
;')OR die(mysql_error());
Innerhalb der Ausgabe des Ergebnisses des ersten Query möchte ich nun die Bilanzen aus der zweiten Anfrage anzeigen lassen.
Kann mir jemand dabei helfen?
Liebe Grüße
Matthias
|
08.06.2008, 20:39:53
|
Anfänger
|
|
Registriert seit: May 2008
Beiträge: 40
|
|
AW: "Verschachtelte" Selects über 3 Tabellen
Ich würde mit Tabelle spieler anfangen und dann einfach mit LEFT JOIN alles dran hängen, was ich brauche
Bei dir scheint Tabelle spieler der Kern deiner Tabellenstruktur zu sein.
Also etwa so
PHP-Code:
SELECT spieler...,
spieler...,
spieler...,
aufstellung...,
aufstellung...,
aufstellung...,
bilanzen...,
SUM(bilanzen...) as name,
MAX(bilanzen...) as noch_n_name,
LEFT JOIN aufstellung
ON (spieler.id = aufstellung.spieler_id)
LEFT JOIN bilanzen
ON (spieler.id = bilanzen.splieler_id)
WHERE ...
GROUP BY spieler.id
ORDER BY ...
LIMIT ...
Denk dran, das du alle spalten indizierst, die in ON oder WHERE klauseln angesprochen werden.
|
09.06.2008, 09:49:56
|
Anfänger
|
|
Registriert seit: Jun 2008
Alter: 44
Beiträge: 6
|
|
AW: "Verschachtelte" Selects über 3 Tabellen
Hi Stb,
danke für Deine Antwort. Hab mir jetzt folgenden Query aus Deinen Tips zusammen gebastelt
Code:
SELECT s.uid, s.name ,s.vorname , s.pic , s.pic_thumb , s.beschreibung1, s.beschreibung2 ,
a.auf_spieler_id, a.saison, a.geschlecht, a.runde, a.mannschaft, a.position,
b.bil_spieler_id, b.saison_clicktt, b.person_clicktt, b.clubnr_clicktt
FROM spieler s
LEFT JOIN aufstellung a
ON (s.id = a.auf_spieler_id)
LEFT JOIN bilanzen b
ON (s.id = b.bil_spieler_id)
WHERE s.id=b.bil_spieler_id
GROUP BY s.id
Allerdings bekomm ich nun für jeden Spieler nur eine Bilanz, nicht alle.
Ich denk mal ein bisschen weiter, falls mir das "Sieges-Bier" von gestern Abend keinen Strich durch die Rechnung macht....
Aber danke schon mal für Schläge auf den Hinterkopf...
Grüße
Geändert von Mattes1001 (09.06.2008 um 09:52:15 Uhr)
Grund: .
|
09.06.2008, 10:23:26
|
Anfänger
|
|
Registriert seit: May 2008
Beiträge: 40
|
|
AW: "Verschachtelte" Selects über 3 Tabellen
Jetzt bekommst du alle:
PHP-Code:
SELECT s.uid, s.name ,s.vorname , s.pic , s.pic_thumb , s.beschreibung1, s.beschreibung2 ,
a.auf_spieler_id, a.saison, a.geschlecht, a.runde, a.mannschaft, a.position,
b.bil_spieler_id, b.saison_clicktt, b.person_clicktt, b.clubnr_clicktt
FROM spieler s
LEFT JOIN aufstellung a
ON (s.id = a.auf_spieler_id)
LEFT JOIN bilanzen b
ON (s.id = b.bil_spieler_id)
WHERE s.id=b.bil_spieler_id
/*
---- GROUP weglassen ---
GROUP BY s.id
*/
Wichtig!
Um COUNT() oder SUM() etc. verwenden zu können, wird GROUP benötigt
|
09.06.2008, 10:45:16
|
Anfänger
|
|
Registriert seit: Jun 2008
Alter: 44
Beiträge: 6
|
|
AW: "Verschachtelte" Selects über 3 Tabellen
:-) sehr gut. Danke!
Nur jetzt hab ich ja das eigentlich Problem. Wobei das wahrscheinlich gar kein SQL Problem mehr ist.
Ich bekomme nun schön alle Bilanzen aber natürlich pro Bilanz auch wieder den kompletten Spieler.
Was ich ja erreichen möchte ist, dass ich nur einmal den Spieler hab und dann alle seine Bilanzen. Aber das muss ich wohl in php abfangen, oder?
momentan mache ich das so:
PHP-Code:
echo "<table>\n";
echo "\t<tr>\n";
echo "\t\t<th> </th>\n";
echo "\t\t<th>Position</th>\n";
echo "\t\t<th>Name</th>\n";
echo "\t\t<th colspan=\"3\">Bilanzen auf Click-TT</th>\n";
echo "\t\t<th> </th>\n";
echo "\t</tr>\n";
if(mysql_num_rows($result)) { // gucken ob was im Query drinsteckt
while($row = mysql_fetch_assoc($result)) {
echo "\t<tr class=\"spieler\">\n";
if (isset($row['beschreibung1'])) $beschreibung1=$row['beschreibung1']; else $beschreibung1="noch keine Text vorhanden.";
if (isset($row['beschreibung2'])) $beschreibung2=$row['beschreibung2']; else $beschreibung2="";
echo "\t\t<td>
\t<a href=\"#TB_inline?height=560&width=660&inlineId=spielerFact".$row['uid']."&modal=true \" class=\"smoothbox\" title=\"".($row['name'].", ".$row['vorname'])."\">
\t\t<img src=\"".$row['pic_thumb']."\" alt=\"".($row['name'].", ".$row['vorname'])." \" height=\"60\" />\n\t\t\t</a>\n\t\t\n";
echo "<div id=\"spielerFact".$row['uid']."\" style=\"display:none;\">
<p style=\"float:left; width:360px;\">
<img src=\"".($row['pic'])."\" style=\"width:330px;\"/>
</p>
<h2 style=\"text-align: center;\">".($row['name'].", ".$row['vorname'])."</h2>
<p>".$beschreibung1."</p>
<p>".$beschreibung2."</p>
<p style=\"clear:both; text-align:center\"><input type=\"submit\" value=\" schließen \" onclick=\"TB_remove()\" /></p>
</div>";
echo "\t\t<td>";
echo $row['position'];
echo "</td>\n";
echo "\t\t<td>";
echo $row['name'].", ".$row['vorname'];
echo "</td>\n";
$saison_string= ereg_replace("20","",$row['saison_clicktt']);
$saison_string= ereg_replace("%2F","/",$saison_string);
echo "\t\t<td>";
echo "<a href=\"http://ttvbw.click-tt.de/cgi-bin/WebObjects/ClickTTVBW.woa/wa/playerPortrait?federation=TTVWH&season=".$row['saison_clicktt']."&person=".$row['person_clicktt']."&club=".$row['clubnr_clicktt']."\" onclick=\"window.open(this.href); return false;\" >".$saison_string."</a>";
echo "</td>\n";
echo "\t</tr>\n";
}
}
echo "</table>\n";
}
Geändert von Mattes1001 (09.06.2008 um 11:00:38 Uhr)
|
09.06.2008, 13:03:53
|
Anfänger
|
|
Registriert seit: May 2008
Beiträge: 40
|
|
AW: "Verschachtelte" Selects über 3 Tabellen
Ja, das geht mit mysql nicht.
sowas fange ich gerne etwa so ab
PHP-Code:
$last_spieler_id = 0;
foreach($spieler as $key => $value){
if($last_pieler_id != $spieler[$key]['spieler_id']){
// neuer spieler name etc.
$last_pieler_id = $spieler[$key]['spieler_id'];
}
// liste details von spieler
}
|
09.06.2008, 16:22:46
|
Anfänger
|
|
Registriert seit: Jun 2008
Alter: 44
Beiträge: 6
|
|
AW: "Verschachtelte" Selects über 3 Tabellen
Ok,danke.
Ich habs mir jetzt einfach gemacht.
Ich mache zwei selects und mache den Query für die Bilanzen innerhalb der Schleife der Aufstellung.
Also:
Code:
$result = mysql_query($aufstellung_spieler)OR die(mysql_error());
if(mysql_num_rows($result)) { // gucken ob was im Query drinsteckt
while($row = mysql_fetch_assoc($result)) {
[...]
$result_b = mysql_query($bilanzen_spieler);
while($row_b = mysql_fetch_assoc($result_b)) {
[...]
}
[...]
}
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 21:49:20 Uhr.
|