假设我的数据库中有三个表:
CREATE TABLE `users` (
`user_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR(16) NOT NULL
);
CREATE TABLE `users_meta` (
`meta_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user_id` INT NOT NULL ,
`key` VARCHAR(200) NOT NULL ,
`value` TEXT NOT NULL
);
CREATE TABLE `posts` (
`post_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user_id` INT NOT NULL ,
`content` TEXT NOT NULL
);
表users_meta只是关于用户信息的键值存储,因此我们可以添加任何我们想要的信息。
说我添加了一个键=>对于密钥为“age”的每个用户,value对users_meta表,值为表示其年龄的数字。
鉴于这种情况,选择按用户年龄排序的前10个帖子的最佳方法是什么?
答案 0 :(得分:1)
如果您按用户年龄订购,则会选择同一用户的10个帖子(最年轻的帖子)。
我建议直接在用户表中进行非规范化和存储年龄。
答案 1 :(得分:1)
同意@KOHb,但如果这正是你想要的,那么这是查询:
SELECT TOP 10 p.id, p.content
FROM users u JOIN users_meta um ON (u.user_id = um.user_id)
JOIN posts p ON (p.user_id = u.user_id)
WHERE um.key = 'age'
ORDER BY um.value
答案 2 :(得分:1)
我喜欢将联接的条件放在联接中,以明确我想要一个有限的联接:
SELECT p.post_id, p.content
FROM users u
INNER JOIN users_meta um
ON (u.user_id = um.user_id) AND um.key = 'age'
INNER JOIN posts p
ON (p.user_id = u.user_id)
ORDER BY um.value
limit 10