使用mysql和mariadb时的结果查询不同

时间:2014-12-05 11:23:25

标签: mysql sql select group-by greatest-n-per-group

这是我的问题:

我的数据库有表Book,Post。每本书都有很多帖子

帖子有字段' book_id ',即外键引用表Book主键(id)。

这是我的索引页面。我们的想法是按照出版日期从每本书和订单中获取最新帖子。

当我在localhost上编码时,每件事都可以。我可以通过发布日期获得每本书的最新帖子和订单。但是当我在vps中部署它时。它没有得到最新的帖子,它从每本书得到第一篇文章。我对此没有任何经验。请帮助,谢谢

在localhost上,我使用:Apache-2.2,PHP-5.3,Mysql-5.5,表的ENGINE类型是InnoDB。

在VPS上,我使用:Nginx 1.7.6,PHP-FPM 5.5.18,MariaDB,表格的引擎类型是MyIsam

我是客人问题是InnoDB和MyIsam,我试着解决它。但是,如果你有空闲时间,请给我一些好的建议。非常感谢

p / s:抱歉我的英语不好

SELECT * FROM `my_book_store`.`books` 
AS `Book` 
INNER JOIN 
(
    SELECT * 
    FROM posts 
    WHERE posts.published = 1 AND posts.published_date <= NOW() 
    ORDER BY posts.published_date DESC
) AS `Post` 
ON (`Post`.`book_id` = `Book`.`id`) 
WHERE 1 = 1 
GROUP BY `Book`.`id` 
ORDER BY `Post`.`published_date` desc 
LIMIT 100   

3 个答案:

答案 0 :(得分:2)

您可以尝试以下查询来完成从每本书中获取最后一篇文章的工作

select
b.id,
b.name,
p.content,
p.published_date
from book b 
join post p on p.book_id = b.id
left join post p1 on p1.book_id = p.book_id and p1.published_date > p.published_date
where p1.id is null;

OR

select 
b.id,
b.name,
p.content,
p.published_date
from book b 
join post p on p.book_id = b.id
where not exists(
  select 1 from post p1 
  where p.book_id = p1.book_id
  and p1.published_date > p.published_date
)

<强> DEMO

答案 1 :(得分:1)

问题似乎是你只是按分组 Book.id但是选择了很多其他非聚合值, 所以实际的查询结果取决于执行计划 优化器想出来了。另见

  

MySQL扩展了GROUP BY的使用,以便选择列表可以   请参阅GROUP BY子句中未命名的非聚合列   [...]
  但是,这主要适用于每个中的所有值   GROUP BY中未命名的非聚合列对于   每组。

     

服务商可以自由选择任何值   组,所以除非它们相同,否则选择的值是   不确定的。
  此外,从每个值中选择值   添加ORDER BY子句不会影响组。

Different result query when use mysql and mariadb

答案 2 :(得分:1)

试试这个:

SELECT b.*, p.*  
FROM my_book_store.books AS b 
INNER JOIN posts p ON b.id = p.book_id
INNER JOIN (SELECT p.book_id, MAX(p.published_date) published_date
            FROM posts p 
            WHERE posts.published = 1 AND posts.published_date <= NOW() 
            GROUP BY p.book_id
          ) AS p1 ON p.book_id = p1.book_id AND p.published_date = p1.published_date 
GROUP BY b.id 
ORDER BY p.published_date DESC 
LIMIT 100