2011-05-11 139 views
0

我有一個news表如下:優化查詢的問題

CREATE TABLE `news` (
    `title` varchar(255) NOT NULL, 
    `hash` char(40) NOT NULL, 
    PRIMARY KEY (`hash`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

而且,另一個votes表如下:

CREATE TABLE `votes` (
    `hash` char(40) NOT NULL, 
    `user_id` varchar(255) NOT NULL, 
    `vote_type` enum('up','down') DEFAULT NULL, 
    PRIMARY KEY (`hash`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

現在,我想是這樣的,當用戶登錄IN-

this_is_a_title hash_12312312 NULL

this_is_a_title hash_12312313了

this_is_a_title hash_12312314 NULL

this_is_a_title hash_12312315下來

您能否提供這個最佳單查詢?

我想我的問題並不清楚。對不起。 通過NULL字段我的意思是一個新的沒有任何投票從這個用戶或任何人流失。


我的版本是 -

SELECT news.*, votes.vote_type 
FROM news 
LEFT OUTER JOIN votes 
ON votes.`hash` = news.`hash` 
AND votes.`user_id` = # 
+2

澄清您的問題 – zerkms 2011-05-11 01:53:27

+0

您是否想查看所有新聞報道以及用戶是否對他們投了票? – Novikov 2011-05-11 02:01:38

+0

@Novikov,是NULL字段我的意思是一個新的沒有任何投票從這個用戶或任何人流失。 – Rifat 2011-05-11 03:14:02

回答

0

我已經與其他解決方案進行了比較,到目前爲止,我正在使用此查詢獲得最佳解決方案。我等了一個多月才找到更好的解決方案。

SELECT news.*, votes.vote_type 
FROM news 
LEFT OUTER JOIN votes 
ON votes.`hash` = news.`hash` 
AND votes.`user_id` = # 
1
SELECT * FROM news JOIN votes ON news.hash = votes.hash WHERE votes.user_id = #; 

這將SELECT對ID爲#特定用戶的新聞文章的所有選票。這些表格與hash是主鍵。因此,根據您當前的配置,它是最佳的。您可以添加user_id的索引以進行其他優化。

注:既然你正在尋找最佳,我建議你不要使用LEFT JOIN。假設news文章會隨着時間的推移而增長,直接使用JOIN會將結果集限制爲僅用戶投出的投票。平均而言,它應該小得多。但是,您需要根據自己的邏輯對此進行補償 - 即沒有新聞記錄意味着沒有投票結果,而不是結果NULL

0

作爲散列是兩個表的主鍵,我相信,你只需要一個INNER JOIN的最佳查詢。

SELECT 
    n.title, 
    v.hash, 
    v.vote_type 
FROM 
    votes v 
    INNER JOIN news n USING(hash) 
WHERE 
    v.user_id=123