У меня возникли проблемы с получением 3 последних комментариев из двух разных таблиц.Получить последние комментарии из нескольких таблиц
Вот мой код, который отлично работает с одним внутренним соединением:
$query = mysql_query("SELECT COUNT(c.topic_id) AS ctid, COUNT(c.deck_id) AS dtid, f.id AS forumid, f.class AS forumclass, f.name AS forumname, f.url AS forumurl,
c.id AS commentid, c.user_id AS commentuser, c.user_name AS commentusername, c.date AS commentdate,
c.topic_id AS topicid, c.deck_id AS deckid
FROM ".$prefix."comment AS c
INNER JOIN ".$prefix."forum AS f
ON c.topic_id = f.id GROUP BY f.id
ORDER BY commentdate DESC LIMIT 3") or die(mysql_error());
Это прекрасно работает она показывает 3 Последние комментарии из таблицы форума, однако у меня есть комментарии в таблице палуб тоже, но когда Я добавляю еще один JOIN в запрос, который он больше не будет работать.
$query = mysql_query("SELECT COUNT(c.topic_id) AS ctid, COUNT(c.deck_id) AS dtid, f.id AS forumid, f.class AS forumclass, f.name AS forumname, f.url AS forumurl,
c.id AS commentid, c.user_id AS commentuser, c.user_name AS commentusername, c.date AS commentdate,
c.topic_id AS topicid, c.deck_id AS deckid, , d.id, d.url AS deckurl, d.name AS deckname
FROM ".$prefix."comment AS c
INNER JOIN ".$prefix."forum AS f
ON c.topic_id = f.id
INNER JOIN ".$prefix."decks AS d
ON c.deck_id = d.id
GROUP BY f.id ORDER BY commentdate DESC LIMIT 3") or die(mysql_error());
Там же комментарий таблица и в замечании таблицы есть topic_id столбец, который равен столбец ид Форума таблицы и есть также deck_id столбец, который равен Идентификатор столбец таблицы палуб в.
Очевидно, что GROUP BY f.id не подходит для двух внутренних соединений.
После этого запроса у меня есть ($ top = mysql_fetch_assoc ($ query)) {... а затем if ($ top ['deckid'] == 0), затем распечатайте информацию о топике, чтобы распечатать информацию о колодедах.
EDIT: комментарий таблица (только то, что важно для нас сейчас): идентификатор, topic_id, deck_id
topic_id = форум идентификатор таблицы
идентификаторdeck_id = палуба стола
Очевидно, что существует без комментариев к каждой теме форума.
E.g .: Forum ID 5 имеет 4 комментария, а затем таблицу комментариев, например .: ID 1,2,3,4 имеет topic_id 4,4,4,4 и deck_id 0,0,0,0.
Если комментариев нет, в таблице комментариев ничего нет. Так что в форуме ID 6 есть 0 комментариев, тогда в таблице комментариев нет ничего.
Если идентификатор колоды 12 имеет 2 комментариев, то таблица комментариев например .: 5,6 имеет deck_id 12,12 и topic_id 0,0.
Форум стол: ID
Deck стол: ID
EDIT2: Решение (не слишком хорошо, но он работает):
//count how many comments the latest 3 deck topic has
$new_comment_query = mysql_query("SELECT COUNT(c.deck_id) AS dtid, c.id, c.deck_id, c.date, d.id
FROM ".$prefix."comment AS c LEFT JOIN ".$prefix."decks AS d ON d.id = c.deck_id GROUP BY d.id ORDER BY date DESC LIMIT 3");
$new_one = mysql_fetch_array($new_comment_query);
//count how many comments the latest 3 forum topic has
$new_forum_query = mysql_query("SELECT COUNT(c.topic_id) AS ctid, c.id, c.topic_id, c.date, f.id
FROM ".$prefix."comment AS c LEFT JOIN ".$prefix."forum AS f ON f.id = c.topic_id GROUP BY f.id ORDER BY date DESC LIMIT 3");
$newer_one = mysql_fetch_array($new_forum_query);
//get all the comments
$comment_query = mysql_query("SELECT id, topic_id, deck_id, date FROM ".$prefix."comment ORDER BY date DESC LIMIT 3");
while ($comment = mysql_fetch_assoc($comment_query))
{
if($comment['topic_id']==0)
{
$deck_query = mysql_query("SELECT * FROM ".$prefix."decks WHERE id=".$comment['deck_id']);
while ($deck_comments = mysql_fetch_assoc($deck_query))
{
//print all the things!
}
}
elseif($comment['deck_id']==0)
{
$forum_query = mysql_query("SELECT * FROM ".$prefix."forum WHERE id=".$comment['topic_id']);
while ($forum_comments = mysql_fetch_assoc($forum_query))
{
//print all the things!
}
}
}
Если вам нравится, рассмотрите следующий простой двухэтапный курс действий: 1.Если вы еще этого не сделали, укажите надлежащие DDL (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, предоставленной на шаге 1. – Strawberry
Внутреннее соединение выбирает все строки из обеих таблиц, если существует совпадение между столбцами в обеих таблицах - может вы попробуете левое соединение вместо этого для целей тестирования? – hlh3406