[Mysql] Abfrage über 4 Tabellen

M

misterbasti

Hallo allerseits!

Also ich sitze schon eine ganze weile daran, hab aber einfach keine Lösung finden können.
Es geht um folgendes:

Ich habe 4 Tabellen
Code:
>> posts
+-----+--------+--------+------------+----------+-------+
| id  | status | author | timestamp  | password | title |
+-----+--------+--------+------------+----------+-------+
| 1   | 1      | 1      | 1293840061 | false    | Test  |
| 2   | 1      | 1      | 1293840061 | false    | Test  |
| 3   | 1      | 1      | 1293840061 | false    | Test  |
| ... | 1      | 1      | 1293840061 | false    | Test  |
+-----+--------+--------+------------+----------+-------+

>> user
+----+------------+------------+
| id | first_name | last_name  |
+----+------------+------------+
| 1  | Max        | Mustermann |
+----+------------+------------+

>> post_terms
+-----+---------+-------------+
| id  | post_id | category_id |
+-----+---------+-------------+
| 1   | 1       | 1           |
| 2   | 1       | 2           |
| 3   | 2       | 4           |
| ... | ...     | ...         |
+-----+---------+-------------+

>> categories
+-----+------+
| id  | name |
+-----+------+
| 1   | HTML |
| 2   | CSS  |
| 3   | PHP  |
| ... | ...  |
+-----+------+

Ich möchte nun die 6 neusten Posts als ergebnis haben,
den dazugehörigen Author, und die Kategorien in denen der Post eingeteil ist.

Dazu habe ich folgende Abfrage geschrieben:
SQL:
SELECT
	`p`.`id`, `p`.`status`, `p`.`author`, `p`.`timestamp`, `p`.`password`, `p`.`title`,
	`u`.`ìd`, CONCAT(`u`.`first_name`, ' ', `u`.`last_name`),
	`pt`.`post_id`, `pt`.`category_id`,
	`c`.`id`, GROUP_CONCAT(`c`.`name` SEPARATOR '  ,  ')
FROM
	`posts` AS `p`
INNER JOIN 
	`user` AS `u` ON (`p`.`author` = `u`.`id`)
INNER JOIN 
	`post_terms` AS `pt` (`p`.`id` = `pt`.`post_id`)
INNER JOIN
	`categories` AS `c` (`pt`.`category_id` = `c`.`id`)
WHERE
	`p`.`status` = '1', `p`.`password` = 'false'
ORDER BY `p`.`id` DESC LIMIT 6

Diese Abfrage führt zu folgendem Ergebnis:
Code:
+----+--------+--------+---------------+----------+-------+----+----------------+---------+-------------+----+-------------------+
| id | status | author | pub_timestamp | password | title | id | CONCAT(...)    | post_id | category_id | id | GROUP_CONCAT(...) |
+----+--------+--------+---------------+----------+-------+----+----------------+---------+-------------+----+-------------------+
| 1  | 1      | 1      | 1293840061    | false    | Test  | 1  | Max Mustermann | 1       | 1           | 1  | HTML , CSS        |
+----+--------+--------+---------------+----------+-------+----+----------------+---------+-------------+----+-------------------+

Ich bekomme den Datensatz genau so wie ich ihn möchte, es gibt nur ein Problem:
Ich bekomme immer nur einen Datensatz.
Bei 6 ist das Maximum und 15 Datensätze befinden sich in der Tabelle "posts".

Ich habe nun ewig lange rumgegooglet,
noch einmal einführungen in JOINs gelesen (da ich damit nicht allzu erfahren bin),
aber bin zu keiner lösung für das Problem gekommen.

Also wie gesagt, ich bin nicht gerade erfahren in der Verwendung von JOINs, da
ich vor einiger Zeit nur von einer JOIN - losen schreibweise zu JOINs gewchselt habe.

Nun möchte ich euch bitten,
mir dabei zu helfen das Problem zu lösen und mir villeicht noch
zu erklären woran dieses Problem genau liegt.

Danke, im voraus.

//Edit
Ich sehe grade das es doch nicht richtig funktioniert, folgendes:

Durch die Tabelle "post_terms" sollen die Kategorien eines Posts zugewiesen werden.
Es ist nun so, das die bedingung " `p`.`id` = `pt`.`post_id` " nicht funktioniert,
es werden also alle Zuweisungen für den datensatz zugewiesen.
 
Zuletzt bearbeitet von einem Moderator:
Gut, das Thema hat sich erledigt beide Probleme wurden
mit folgender veränderung behoben:

SQL:
GROUP BY `p`.`id` ORDER BY `p`.`id` DESC LIMIT 6

Weiter kam es dazu das Ergebniszeilen fehlten,
da nicht alle Posts eine Kategorie über die "post_terms" Tabelle zugewiesen bekommen haben.
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück