[英]SQL Query two tables and combine results (with a twist)
我有两个表: users
和users_info
users
看起来像这样:
+----+----------+-------+
| id | slug | name |
+----+----------+-------+
| 1 | theploki | Kris |
+----+----------+-------+
和users_info
看起来像这样:
+----+--------+----------+---------------+
| id | parent | info_key | info_val |
+----+--------+----------+---------------+
| 1 | 1 | email | kris@kris.com |
+----+--------+----------+---------------+
| 2 | 1 | age | 28 |
+----+--------+----------+---------------+
我想SELECT
一个user
谁拥有user_info
电子邮件=“kris@kris.com”
-和-
返回所有具有匹配的users_info.parent = user.id
user_info
结果
-和-
以可读格式(例如result['email'] = 'kris@kris.com'
和result['id'] = 1
以及result['name'] = 'Kris'
和result['age'] = 28
)
我确定这已在另一个问题中得到解答,但我一直在搜索和阅读对我而言并不完全有效的答案。
显然,我确保info_key
不能与users
列名匹配。
我尝试了INNER JOIN,OUTER JOIN,只是简单的JOIN,并且我尝试了完全没有任何JOIN。
这不起作用,但是有点解释了我想做什么:
SELECT * FROM users
WHERE 1=1
AND users.slug='theploki'
AND (SELECT * FROM users_info
WHERE users_info.parent = users.id
AND 1=1
AND users_info.info_key = 'email'
AND users_info.info_val = 'kris@kris.com'
GROUP BY users_info.parent)
GROUP BY users.id
有时我不会搜索信息列,有时我不会搜索用户列,这就是为什么我将1=1
也许执行两个查询然后将它们组合起来会更简单?
好的,这是更新的SQL查询(由scaisEdge提供):
SELECT users.*, users_info.* FROM users
INNER JOIN users_info on users_info.parent = users.id
where users.id = (SELECT users_info.parent FROM users_info
WHERE users_info.parent = users.id
AND users_info.info_val = 'kris@kris.com')
这非常接近,但是返回如下结果集:
+----+----------+-------+----+--------+----------+---------------+
| id | slug | name | id | parent | info_key | info_val |
+----+----------+-------+----+--------+----------+---------------+
| 1 | theploki | Kris | 1 | 1 | email | kris@kris.com |
+----+----------+-------+----+--------+----------+---------------+
| 1 | theploki | Kris | 2 | 1 | age | 28 |
+----+----------+-------+----+--------+----------+---------------+
但我想要这样的结果集:
+----+----------+-------+---------------+-----+
| id | slug | name | email | age |
+----+----------+-------+---------------+-----+
| 1 | theploki | Kris | kris@kris.com | 28 |
+----+----------+-------+---------------+-----+
同一父用户应为
SELECT users.*, users_info.* FROM users
INNER JOIN users_info on users_info.parent_id = users.id
where users.id = (SELECT users_info.parent FROM users_info
WHERE users_info.parent = users.id
AND users_info.info_val = 'kris@kris.com')
仅作为示例,您可以使用列名和别名更改user。* ord users_info。*
SELECT users.slug, users.name as name, group_concat(users_info.info_val) FROM users
INNER JOIN users_info on users_info.parent_id = users.id
where users.id = (SELECT users_info.parent FROM users_info
WHERE users_info.parent = users.id
AND users_info.info_val = 'kris@kris.com')
group by users.name
SELECT users_info.info_val AS email
FROM users JOIN users_info ON users_info.parent_id = users.id
WHERE users_info.info_key = 'email'
那应该为您想要的结果工作。 提供的另一个答案要求您在编写查询之前知道要查找的结果。 不过,正如我在上面的评论中提到的那样,这是一种结构化数据库的奇怪方法,除非您有特殊原因,否则常规用户信息(例如电子邮件地址)将位于users
表中。
但是,如果您打算有一个最小的用户表,然后为他们提供通用的键值编码信息,则此查询将起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.