Sempervivum
Erfahrenes Mitglied
Liebe Datenbankspezialisten,
bei Stackoverflow
Can my query using join and a subquery be simplified?
habe ich leider keine Lösung bekommen, daher versuche ich es hier.
Mit viel Googeln, Nachdenken und Versuch & Irrtum habe ich diese Abfrage gebaut:
Sieht für mich ziemlich kompliziert aus und die Frage ist, ob man sie vereinfachen kann.
Die Tabelle movie enthält Daten wie Titel, Jahr, Genre etc. Die Drehorte stehen in einer anderen Tabelle coords. Ziel der Abfrage ist, die Filme nach Anzahl der Drehorte sortiert zu bekommen und zusätzlich eine Liste der Drehorte.
Mit einer kleinen Nachverarbeitung:
sieht das Ergebnis dann so aus und das ist genau was gewünscht ist:
Wie gesagt, die Frage ist, ob man die Abfrage vereinfachen kann.
bei Stackoverflow
Can my query using join and a subquery be simplified?
habe ich leider keine Lösung bekommen, daher versuche ich es hier.
Mit viel Googeln, Nachdenken und Versuch & Irrtum habe ich diese Abfrage gebaut:
Code:
SELECT sq.movie_id,
sq.movie_title,
sq.number,
sq.movie_year,
coords.loc_country
FROM (SELECT Count(*) AS `number`,
`coords`.`id_movie` AS movie_id,
`movie`.`title` AS movie_title,
`movie`.`year` AS movie_year
-- possibly more info about the movie
FROM `coords`
LEFT JOIN `movie`
ON `movie`.`id` = `coords`.`id_movie`
GROUP BY `coords`.`id_movie`
) AS sq
LEFT JOIN coords ON coords.id_movie = sq.movie_id
ORDER BY sq.number DESC, sq.movie_title ASC
Die Tabelle movie enthält Daten wie Titel, Jahr, Genre etc. Die Drehorte stehen in einer anderen Tabelle coords. Ziel der Abfrage ist, die Filme nach Anzahl der Drehorte sortiert zu bekommen und zusätzlich eine Liste der Drehorte.
Mit einer kleinen Nachverarbeitung:
Code:
$result = $pdo->query($sql);
$resultArr = [];
$movieId = -1;
while ($row = $result->fetchObject()) {
if ($row->movie_id != $movieId) {
$movieId = $row->movie_id;
$resultArr[$movieId] = [
'movie_title' => $row->movie_title,
'movie_year' => $row->movie_year,
'number' => $row->number,
'drehorte' => [],
];
}
$resultArr[$movieId]['drehorte'][] = $row->loc_country;
}
Code:
array(632) {
[881]=>
array(4) {
["movie_title"]=>
string(20) "Eddie Izzard: Circle"
["movie_year"]=>
string(4) "1984"
["number"]=>
string(1) "6"
["drehorte"]=>
array(6) {
[0]=>
string(6) "Brazil"
[1]=>
string(5) "Kenya"
[2]=>
string(7) "Ukraine"
[3]=>
string(4) "Peru"
[4]=>
string(11) "Philippines"
[5]=>
string(8) "Slovenia"
}
}
[171]=>
array(4) {
["movie_title"]=>
string(5) "Torso"
["movie_year"]=>
string(4) "1923"
["number"]=>
string(1) "6"
["drehorte"]=>
array(6) {
[0]=>
string(11) "Philippines"
[1]=>
string(7) "Vietnam"
[2]=>
string(5) "China"
[3]=>
string(5) "Japan"
[4]=>
string(4) "Peru"
[5]=>
string(8) "Colombia"
}
}
[266]=>
array(4) {
["movie_title"]=>
string(24) "Anton Chekhov's The Duel"
["movie_year"]=>
string(4) "1939"
["number"]=>
string(1) "5"
["drehorte"]=>
array(5) {
[0]=>
string(5) "China"
[1]=>
string(6) "Brazil"
[2]=>
string(6) "Russia"
[3]=>
string(14) "Czech Republic"
[4]=>
string(6) "Mexico"
}
}
usw.