MySQL - Mehrere Tabellen zusammen auslesen, nach verschiedenen Spalten sortieren

Atalión

Mitglied
Hallo! :)

Ich stehe vor folgendem Problem: Ich habe folgende drei Tabellen (auf's Wesentliche reduziert, Tabellenname fett, darunter die Spalten):

movies
movieID
movieTitle

books
bookID
bookTitle

games
gameID
gameTitle


Jetzt möchte ich daraus gerne eine Übersicht erstellen, und zwar nicht Filme, Bücher und Spiele einzeln, sondern eine lange Liste, wo alle Titel (Filme, Bücher und Spiele zsuammen) alphabetisch geordnet drinstehen. Und ich habe leider keinen Plan, wie ich das anstellen soll. Ich hatte es versucht, indem ich alle gleichzeitig auslese (FROM movies, books, games), aber wenn ich das mache, friert der Server ein.

Was müsste ich da machen?

LG,
Malte :)
 
Also ich würd das so versuchen (nicht getestet):

SQL:
SELECT
  `movies`.`movieID`,
  `movies`.`movieTitle`,
  `books`.`bookID`,
  `books`.`bookTitle`,
  `games`.`gameID`,
  `games`.`gameTitle`
FROM
  `movies`,
  `books`,
  `games`

Das sollte kein Problem machen, es sei denn, du hast übermäßig viele Einträge in den Tabellen. Dann solltest du die Auswahl mit LIMIT eingrenzen bzw ne Pagination einbauen.

Viele Grüße,
Frezl

// ERGÄNZUNG:

Hab mich jetzt aus Interesse auch mal mit dem Thema befasst und etwas interessanter wäre für dich vll. diese Abfrage:
SQL:
(
SELECT
  `movies`.`movieID` AS `id`,
  `movies`.`movieTitle` AS `title`
FROM
  `movies`
)
UNION
(
SELECT
  `books`.`bookID` AS `id`,
  `books`.`bookTitle` AS `title`
FROM
  `books`
)
UNION
(
SELECT
  `games`.`gameID` AS `id`,
  `games`.`gameTitle` AS `title`
FROM
  `games`
)
Dann hast du jeden Datensatz in ner eigenen Zeile, was auf jeden Fall schöner wäre. Mit etwas Geschick kannst du da jetzt zu jedem Datensatz noch den Typ (movie, book, game) einbauen und fertig ist die Laube ;-)
 
Zuletzt bearbeitet:
Mit UNION alle Daten untereinander zusammennehmen. Dann noch eine künstliche Spalte table_name oder so, damit du nachher immer noch weisst woher die Daten kommen

SQL:
SELECT
  movieID       AS id
  movieTitle    AS title
  'movies'      AS table_name
FROM
  movies  
UNION ALL
SELECT
  bookID       AS id
  bookTitle    AS title
  'books'      AS table_name
FROM
  books  
UNION ALL
SELECT
  gameID       AS id
  gameTitle    AS title
  'games'      AS table_name
FROM
  games
ORDER BY
  title;
 
Zuletzt bearbeitet von einem Moderator:
Ver****t, der Yaslaw wieder. Kam er da um die Ecke gesprungen, bevor ich meinen Edit fertig hatte :-D Und sogar die Lösung für die Typen hat er schon mit drin... Alle Achtung!
 
Dankeschön euch beiden!

Funktioniert genau so, wie es sein soll. Danke! =D


Edit: Ich mach doch mal einen neuen Post aus dem Edit, sonst merkt niemand, dass es hier was neues gibt *h*
 
Zuletzt bearbeitet:
Okay sorry, ich muss hier doch noch einmal etwas fragen.

Wenn ich mir jetzt z.B. nur die DB-Einträge mit dem Anfangsbuchstaben "A" anzeigen lassen möchte, bekomm ich Schwierigkeiten mit dem Spaltennamen. Egal, ob ich in der WHERE-Klausel "title" benutze oder den Originaltitelnamen, ich bekomme immer die Fehlermeldung, dass die Spalte nicht existiert. Kann man in der WHERE-Klausel nicht den Namen verwenden, den man bei "Select ... AS ... " vergeben hat? Welchen müsste man dann nehmen?

Lg,
Malte :)
 
Im Notfall als Subquery verwenden
SQL:
SELECT
  *
FROM
  (
    -- Dein UNION-QUery:
    SELECT
      movieid AS id,
      movietitle AS title,
    ....
    UNION ALL
    .....
  ) AS mydata
WHERE
  title LIKE 'A%';
 
Zuletzt bearbeitet von einem Moderator:
Wie es scheint, geht das nicht. Außerdem musst du den Where-Clause auf jeden Select einzeln anwenden. Das haben jedenfalls meine Recherchen und Versuche ergeben.

SQL:
(
SELECT
  `movies`.`movieID` AS `id`,
  `movies`.`movieTitle` AS `title`,
  'movie' AS 'type'
FROM
  `movies`
WHERE
  `movies`.`movieTitle` LIKE 'A%'
)
UNION ALL
(
SELECT
  `books`.`bookID` AS `id`,
  `books`.`bookTitle` AS `title`,
  'book' AS 'type'
FROM
  `books`
WHERE
  `books`.`bookTitle` LIKE 'A%'
)
UNION ALL
(
SELECT
  `games`.`gameID` AS `id`,
  `games`.`gameTitle` AS `title`,
  'game' AS 'type'
FROM
  `games`
WHERE
  `games`.`gameTitle` LIKE 'A%'
)

Grüße,
Frezl
 
Alter, Yaslaw, du bist mir unheimlich! Lauerst du mir auf um dann zuzuschlagen, wenn ich grad am Schreiben bin? Subquery, soso, wieder was gelernt :)

@Malte: Im Zweifel hat Yaslaw Recht...
 
item: Es ist kein Zweifel - Beide Varianten stimmen.
Das Subquery ist eleganter. Je nach Datenmenge könnte deine Version schneller sein. Müsste man messen und den Explain-Plan studieren den MySQL für diese Abfrage zusammensetzt.

item: Nope, bin harmlos und lauere nicht auf *g*
 

Neue Beiträge

Zurück