Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我如何从mysql中的key:value元表加入数据?_Php_Sql_Mysql - Fatal编程技术网

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

Php 我如何从mysql中的key:value元表加入数据?,php,sql,mysql,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) N

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

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

假设我为每个用户的users\u元表添加了一个key=>value对,其中key是“age”,值是代表他们年龄的数字


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

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


我建议取消规范化并直接将年龄存储在用户表中。

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


我建议将年龄反规范化并直接存储在users表中。

同意@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

同意@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

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

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

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

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

最好的办法是尽快放弃这种结构。这是最糟糕的数据库查询设计。在这种情况下,您如何解决允许将任何元数据应用于用户的问题?我不同意HLGEM。。我喜欢这种结构,尤其是当关联的元数据很少应用到我的主表(本例中的用户)时。我认为这种类型结构的实际用例在我的示例中没有很好地表示出来。这更适合于应用于对象的“自定义字段”,而不是像一些人所建议的那样,像年龄这样可能更适合直接绑定到用户表的东西。最好的方法是尽快放弃这种结构。这是最糟糕的数据库查询设计。在这种情况下,您如何解决允许将任何元数据应用于用户的问题?我不同意HLGEM。。我喜欢这种结构,尤其是当关联的元数据很少应用到我的主表(本例中的用户)时。我认为这种类型结构的实际用例在我的示例中没有很好地表示出来。这更适合于应用于对象的“自定义字段”,而不是像年龄这样的东西,年龄可能更适合直接绑定到用户表,正如一些人所建议的。在我看来,它混合了连接运算符和选择运算符,这会降低代码的可读性。我选择这个答案是因为它使连接多个元字段变得更简单,因为您可以多次连接元表。这在我的示例中并没有出现,但我认为这种随机元数据结构是一个很好的用例。在我看来,它混合了连接和选择运算符,这使得代码可读性降低。我选择这个答案是因为它使连接多个元字段变得更简单,因为您可以多次连接元表。这在我的示例中并没有出现,但我认为这是一个很好的随机元数据结构的用例。