对问题的最佳查询

时间:2011-05-11 01:49:02

标签: mysql sql

我有一个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;

现在我想在用户登录时得到类似的内容 -

  

this_is_a_title hash_12312312 NULL

     

this_is_a_title hash_12312313 up

     

this_is_a_title hash_12312314 NULL

     

this_is_a_title hash_12312315 down

您能为此建议一个最佳的单一查询吗?

我认为我的问题不明确。对不起。 通过NULL字段,我的意思是一个新的,没有从这个用户或任何人投来的任何投票。


我的版本是 -

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

4 个答案:

答案 0 :(得分:1)

SELECT * FROM news JOIN votes ON news.hash = votes.hash WHERE votes.user_id = #;

对于ID为SELECT的特定用户,这将#对新闻报道的所有投票。这些表与hash连接,这是一个主键。因此,根据您当前的配置,它是最佳的。您可以为user_id添加索引以进行其他优化。

注意:由于您正在寻找最佳,我建议您不要使用LEFT JOIN。假设news篇文章会随着时间的推移而增长,使用直接JOIN会将结果集限制为仅用户投票的投票。平均来说,这应该小得多。但是,你需要在你的逻辑中补偿这一点 - 即没有新闻记录意味着没有投票而不是NULL结果。

答案 1 :(得分:0)

SELECT news.title, news.hash, votes.vote_type 
FROM news 
LEFT JOIN votes USING(hash) 
WHERE votes.user_id = @my_user_id

以下是不同类型的联接What is the difference between Left, Right, Outer and Inner Joins?

的详细分类

答案 2 :(得分:0)

由于哈希是两个表的主键,我相信你只需要一个内部联接来获得最佳查询。

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

答案 3 :(得分:0)

我已经与其他解决方案进行了比较,到目前为止,我已经通过此查询获得了最佳解决方案。我等了一个多月才找到更好的解决方案。

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