如何从mysql中的key:value元表中加入数据?

时间:2009-11-19 19:49:29

标签: php sql mysql

假设我的数据库中有三个表:

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个帖子的最佳方法是什么?

3 个答案:

答案 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