我有一个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` = #
答案 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` = #