2015-03-10 2 views
0

У меня есть список новостей с тремя категориями. Скажем, категория1, category2, category3. Каждая статья имеет дату публикации. Теперь это возможно, чтобы получить список следующим образом:Комплексный mysql запрос - группировка и упорядочение по дате

most recent article in category1 
most recent article in category2 
most recent article in category3 
second most recent article in category1 
second most recent article in category2 
second most recent article in category3 

И если оба category1 и category3 есть одна статья слева, а category2 Закончились статей, приведенный выше список будет сопровождаться:

third most recent article in category1 
third most recent article in category3 

Я не знаю, возможно ли это в запросе mysql. Пожалуйста помоги!

ответ

0

Если ваша категория Количество ограничено, вы можете закодировать ее и в каждом цикле, объединить sqls с UNION; это SQL: "SELECT * FROM news WHERE 1 GROUP BY ".$category." ORDER BY publish_date DESC LIMIT ".$categoryCount." UNION ALL"

Примечание: Не забудьте SubStr последний «UNION ALL» строка

+0

нет, название категории издеваются здесь, может быть любая строка. – Michael

0

Я вижу такие вопросы, как это так часто, особенно когда речь идет о веб-содержимого приложения. Мне нужен самый последний X в любом случае. В этом случае вам нужны последние 3 статьи. Вместо того, чтобы пытаться структурировать запросы, которые будут больно работать, я бы предложил денормализовать данные для таблицы новостей новостей.

Добавить 3 столбца для последних 3 статей. Затем добавьте триггер в таблицу статей. Когда статья добавляется в таблицу, обновляйте таблицу категорий с ней в качестве самой новой позиции и сдвигайте два других, чтобы они всегда катились ... Не положительно на синтаксисе триггера, но что-то вроде следующего для обновление ...

update Category 
    set ThirdArticleID = SecondArticleID, 
     SecondArticleID = FirstArticleID, 
     FirstArticleID = NewArticleIDJustAdded 
    where CategoryID = NewArticleCategoryID 

Тогда вы можете просто присоединиться к левым в категорию и всегда есть «последние 3» что-то вроде

select 
     c.*, 
     A1.ArticleTitle as FirstArticle, 
     A2.ArticleTitle as SecondArticle, 
     A3.ArticleTitle as ThirdArticle 
    from 
     Category C 
     LEFT JOIN Articles A1 
      on C.FirstArticleID = A1.ArticleID 
     LEFT JOIN Articles A2 
      on C.SecondArticleID = A2.ArticleID 
     LEFT JOIN Articles A3 
      on C.ThirdArticleID = A3.ArticleID 

Тогда вы не имеют любую мин(), не более(), группу, порядок по убыванию и т. д., чтобы беспокоиться. Возможно, вам захочется предварительно загладить записи этой категории, но после того, как записи получат новые статьи, она будет самосинхронизироваться.

Смежные вопросы