PHP MySQL двойное внутреннее соединение - PullRequest
5 голосов
/ 05 июня 2011

У меня есть три таблицы:

сообщений

  • ID
  • post_id
  • user_id

комментарии

  • ID
  • post_id
  • comment_id
  • user_id
  • удален

ответ

  • ID
  • post_id
  • reply_id
  • user_id
  • удален

Я пытаюсь получить все комментарии и ответы от каждого post.post_id с post.user_id=x.

Я пытался:

    SELECT *
    FROM posts AS p
    INNER JOIN comments as c
    ON c.comment_id=p.post_id
    INNER JOIN replies as r
    ON r.reply_id=p.post_id
    WHERE
    p.user_id='x'

, который возвращает 0 ...


Решение было

SELECT *
FROM POSTS A
LEFT JOIN COMMENTS B ON A.POST_ID=B.COMMENT_ID
LEFT JOIN REPLIES C ON A.POST_ID=C.REPLY_ID
WHERE A.USER_ID='X'

Итак, если я добавлю удаленный столбец в таблицы comments и , как я могу проверить, не удаляются ли полученные мной комментарий или ответ?

Я пытался добавить после A.USER_ID='X' && B.deleted='0' && C.deleted='0'

Но возвращается 0.

Ответы [ 3 ]

7 голосов
/ 05 июня 2011

Вам не хватает ключевых отношений в вашей модели.Вам нужно иметь столбец в ответах и ​​комментариях для post_id, а затем объединить таблицы с post_id.

После внесения этого изменения ваш запрос будет выглядеть следующим образом:

SELECT c.*, r.* 
FROM posts p
INNER JOIN comments c ON p.id=c.post_id
INNER JOIN replies r ON p.id=r.post_id
WHERE p.user_id=$user_id
2 голосов
/ 05 июня 2011

Попробуйте использовать левые соединения вместо внутренних. Это обеспечит присутствие всех строк таблицы POSTS, соответствующих критериям WHERE.

SELECT *
FROM POSTS A
LEFT JOIN COMMENTS B ON A.POST_ID=B.COMMENT_ID
LEFT JOIN REPLIES C ON A.POST_ID=C.REPLY_ID
WHERE A.USER_ID='X'
0 голосов
/ 05 июня 2011

Из того, что я вижу, post_id отсутствует во всех таблицах.Слишком много идентификаторов.

Измените таблицу, чтобы отношения были очевидны, и тогда вы сможете легко извлечь данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...