2014-12-05 131 views
1

这是我的问题:当使用mysql和mariadb时不同的结果查询

我的数据库有表格Book,Post。每本书都有许多后

帖子有场“book_id”,即外键引用表簿的主键(ID)。

这是我的索引页。这个想法是在发布日期之前从每本书和订单中获取最新的帖子。

当我在本地主机上编码时,每件事情都可以。我可以从每本书中获取最新的帖子,并按发布日期排序。但是,当我部署在vps中。它没有得到最新的文章,它从每本书中获得第一篇文章。我对此没有任何经验。请帮助,谢谢

在本地主机上,我使用:Apache-2.2,PHP-5.3,Mysql-5.5,引擎类型为表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 
+1

它肯定不会涉及到'engine'。但是,如果你想获得最新的帖子(最后一个添加),还有其他方法可以做得更好。 – 2014-12-05 11:36:16

+0

查询本身是一个问题,特别是由于其有序的子查询。每本书都应该加入到该书最新的一篇文章中,子查询应该计算出该文章的关键。 – 2014-12-05 11:58:50

+0

非常感谢,Abhik Chakraborty和德米特里格雷科夫:) – minhchieng 2014-12-05 14:05:46

回答

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 
+0

非常感谢Saharsh Shah。我知道了 :) – minhchieng 2014-12-05 14:02:31

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

我喜欢第一个解决方案。在一些圈子里,它甚至以我的名字命名(虽然错误)!!但它不是表演性的。第二种解决方案使用相关的子查询。再次,这不是表演性的。根据手册中提供的示例,更好的解决方案可能会使用不相关的子查询。 – Strawberry 2014-12-05 12:27:03

+0

非常感谢,阿比克Chakraborty :)。我知道了 – minhchieng 2014-12-05 14:03:26

1

的问题似乎是,你只能通过 Book.id分组而是选择了很多其他非聚合值中, 所以实际的查询结果取决于 优化想出了一个执行计划。另请参见

MySQL的扩展使用GROUP BY的,这样的选择列表可以
指在GROUP BY子句中未命名的非聚合列。
[...]
然而,主要当在GROUP BY未命名每个
非聚集列中的所有值是 每个组相同的,这是有用的。

该服务器是自由地从每个组 选择的任何VALUE,所以,除非它们是相同的,所选择的值是 不确定的。
此外,每个 组中的值的选择不受添加ORDER BY子句的影响。

Different result query when use mysql and mariadb

+0

非常感谢,Harmut :) – minhchieng 2014-12-05 14:04:35