php mysql оставил соединение, где ошибка пункта - PullRequest
1 голос
/ 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', и комментарий или ответ не удаляются (0)

это то, что я пробовал

SELECT *
FROM posts p
LEFT JOIN comments c ON p.id=c.post_id
LEFT JOIN replies r ON p.id=r.post_id
WHERE p.user_id=$user_id
&& c.deleted='0' && r.deleted='0'

который не работает ...

Ответы [ 2 ]

1 голос
/ 05 июня 2011

Вам необходимо поместить удаленный чек в предложение объединения .Это должно сделать это:

SELECT *
FROM posts p
LEFT JOIN comments c ON c.post_id = p.post_id AND NOT c.deleted
LEFT JOIN replies r ON r.post_id = p.post_id AND NOT r.deleted
WHERE p.user_id = $user_id

Примечание: не уверен, что c.post_id присоединяется к p.id или p.post_id - измените предложение on, как требуется

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

В сообщении могут быть комментарии или нет. Используйте LEFT JOIN вместо INNER JOIN.

Сообщение может иметь ответы или нет. В этом соединении используйте LEFT JOIN вместо INNER JOIN.

Когда используется LEFT JOIN, условие, подобное WHERE comments.deleted = 0, которое включает поле (из правой таблицы (comments) в LEFT JOIN), LEFT JOIN отменяется. Итак, мы должны поместить это условие в предложение ON, а не в WHERE.

SELECT *
FROM posts p
  LEFT JOIN comments c
    ON p.post_id = c.post_id
    AND c.deleted = 0
  LEFT JOIN replies r
    ON p.post_id = r.post_id
    AND r.deleted = 0  
WHERE p.user_id = $user_id

Если подумать более четко, приведенное выше покажет, что описывает вопрос, но в случаях, скажем, с 4 комментариями и 3 ответами, будет возвращено 12 строк (3x4). Который, вероятно, не хотел. Следующая вторая попытка не имеет такой проблемы.

Я не вижу post.text или comment.text или reply.text в таблицах, но в любом случае, вы поймете идею. Вы можете удалить строки 3 text, если не подходит.

  ( SELECT p.post_id     AS post_id 
         , 0             AS type
         , p.post_id     AS id
         , p.text        AS text
    FROM posts p
    WHERE p.user_id = $user_id
  )
UNION ALL
  ( SELECT p.post_id     AS post_id 
         , 1             AS type
         , c.comment_id  AS id
         , c.text        AS text
    FROM posts p
      JOIN comments c
        ON p.post_id = c.post_id
    WHERE p.user_id = $user_id
      AND c.deleted = 0
  )
UNION ALL
  ( SELECT p.post_id     AS post_id 
         , 2             AS type
         , r.reply_id    AS id
         , r.text        AS text
    FROM posts p
      JOIN replies r
        ON p.post_id = r.post_id
    WHERE p.user_id = $user_id
      AND r.deleted = 0
  )
ORDER BY post_id
       , post_type
       , id

0,1,2 означает пост, комментарий, ответ.

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