Как вернуть данные из нескольких таблиц MySQL в порядке дат? - PullRequest
1 голос
/ 26 апреля 2009

У меня другая проблема с MySQL. Опять же, со сложными запросами я нахожусь над моей головой.

На моем сайте я в настоящее время отображаю последние 5 рассмотренных игр на главной странице. Теперь это тикает уже давно, и я решил добавить новости на ту же страницу.

Но я хочу изменить систему, которая у меня есть, на систему, которая отображает записи новостей и обзоры - показывая последнюю запись, которая была опубликована в любой категории. Обе таблицы совершенно не связаны (новости, обзор).

Следующие столбцы - это то, что я хочу вернуть:

news.newsTitle
news.newsBody
news.postedOn (timestamp)
review.postedOn (timestamp)
review.reviewSummary
review.ourScore
game.gameName
game.gameImage

Таблица game связана с таблицей review с идентификатором gameID, но ни одна из этих таблиц не связана с таблицей news .

Текущий запрос:

SELECT news.newsTitle, news.newsBody, DATE_FORMAT( review.postedOn,  '%M %d, %Y' ) AS reviewPosted, DATE_FORMAT( news.postedOn,  '%M %d, %Y' ) AS newsPosted, game.gameID, gameName, gameImage, review.reviewSummary, review.ourScore
FROM game
LEFT JOIN news ON news.newsID = news.newsID
LEFT JOIN review ON game.gameID = review.gameID
WHERE game.isPublished =  'y'
ORDER BY game.gameID DESC 
LIMIT 0 , 5

Но все, что для этого нужно - это отобразить новость 5 раз вместе с информацией об игре.

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

3 голосов
/ 26 апреля 2009

Вам нужно исследовать UNION - создать два запроса, которые выводят одинаковое количество (и эквивалентных) столбцов, объединить результаты с помощью UNION, затем упорядочить по дате и ограничить результаты до верхних 5.

Используя вышеизложенное, вы можете вернуть новейшие топ-5 независимо от их сочетания между новостями / обзорами - это то, что вы имеете в виду?

Следующие данные должны вернуть желаемые данные:

(SELECT news.newsTitle AS title, news.newsBody AS body, 
DATE_FORMAT( news.postedOn,  '%M %d, %Y' ) AS posted,
news.postedOn, null AS image, null AS score
FROM news)
UNION ALL
(SELECT game.gameName as title, review.reviewSummary AS body,
DATE_FORMAT( review.postedOn,  '%M %d, %Y' ) AS posted,
review.postedOn, game.gameImage AS image, review.ourScore AS score
FROM game LEFT JOIN review ON game.gameID = review.gameID 
WHERE game.isPublished = 'y')    
ORDER BY postedOn DESC
LIMIT 0,5
2 голосов
/ 26 апреля 2009

Почему вы хотите получить два совершенно не связанных друг с другом фрагмента данных одним и тем же запросом? Вы можете заняться акробатикой, генерируя rowid для каждого результата из обзоров и новостей, а затем объединяя результаты в rowids; или выбрав одинаковые столбцы из обоих и используя UNION, как предложил BrynJ. Но все это кажется совершенно ненужным, когда вы можете просто выполнить два запроса.

Эти вещи принадлежат друг другу?

Если бы вы писали это, используя объекты в памяти, а не в базе данных - была бы у вас какая-нибудь Коллекция, включающая обе, или две отдельные коллекции, которые содержали их отдельно?

Обновление Я получил ответы на свои вопросы в комментариях; Теперь я понимаю, что вы пытаетесь сделать. Я видел, как это делается двумя способами: один - выбрать самые последние данные из всех источников (комментарии, обзоры, новости, загруженные фотографии и т. Д.), Отсортировать их по дате и получить X лучших из них. на клиенте. Это имеет недостаток, заключающийся в том, что количество запросов увеличивается пропорционально количеству источников данных, но имеет преимущество в том, что он очень гибкий с точки зрения уровня представления - вы можете выбирать разные столбцы из разных объектов, форматировать их по мере необходимости. желайте и делайте все, что вам нужно, на стороне клиента (в данном случае клиентом является ваше программное обеспечение, а не веб-клиент).

Другой - обеспечить согласованный набор столбцов, которые вам нужны для представления любого объекта, который может быть нулевым - обычно такого типа, как «тип, заголовок, тело, дата, img_id» или что-то в этом роде, - и использовать союз, как предложено другим плакатом. Это позволяет вам использовать один запрос, что делает ваше программное обеспечение менее сложным; у него есть недостатки, заключающиеся в том, что он дает вам меньшую гибкость, когда речь идет о других типах вещей, которые вы, возможно, захотите вставить в канал, и, возможно, перегружает базу данных (эта часть зависит от того, насколько узким местом является БД в вашем случае).

0 голосов
/ 26 апреля 2009

Хорошо, я на полпути. Проблема заключалась в сортировке форматирования даты: при выборе временной метки в качестве фиктивного MySQL теперь возвращает правильный набор результатов. Уф!

(
SELECT news.newsTitle AS title, news.newsBody AS body, news.postedOn AS dummy, DATE_FORMAT( news.postedOn,  '%M %d, %Y' ) AS posted
FROM news
)
UNION ALL (

SELECT game.gameName AS title, review.reviewSummary AS body, review.postedOn AS dummy, DATE_FORMAT( review.postedOn,  '%M %d, %Y' ) AS posted
FROM game
LEFT JOIN review ON game.gameID = review.gameID
WHERE game.isPublished =  'y'
)
ORDER BY dummy DESC 
LIMIT 0 , 5

Могу ли я заставить MySQL возвращать оставшиеся данные (счет игры и изображение игры) для строк обзора и ноль, если это строка новостей?

Я понимаю, что это может быть невозможно, но если быстрый взлом сделает это, значит, лучше.

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