繁体   English   中英

SQL查询两个表并合并结果(略有不同)

[英]SQL Query two tables and combine results (with a twist)

我有两个表: usersusers_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM