代码之家  ›  专栏  ›  技术社区  ›  Travis

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

  •  0
  • Travis  · 技术社区  · 15 年前

    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\u meta只是一个关于用户信息的键值存储,这样我们就可以添加任何我们想要的信息。

    在这种情况下,按用户年龄选择前10篇文章的最佳方法是什么?

    3 回复  |  直到 15 年前
        1
  •  1
  •   KOHb    15 年前

    如果您仅按用户年龄订购,您将选择同一用户的10篇文章(最年轻的一篇)。

        2
  •  1
  •   Dmitry    15 年前

    同意@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
    
        3
  •  1
  •   Zak    15 年前

    我喜欢将连接的条件放在连接本身中,以明确我想要有限的连接:

    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