这是我的问题:
我的数据库有表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
答案 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子句不会影响组。
答案 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