2014-12-05 32 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