我想使用我用于选择用户的相同查询来选择用户组合。
这是我想要的例子。
用户表
----------------------------------------------------------------------
UID NAME USERNAME EMAIL PASSWORD STATUS
----------------------------------------------------------------------
1 Manoj manoj a@a.com ******** 1
2 Test U testing b@a.com ******** 1
3 Company user c@a.com ******** 1
4 Agency company d@a.com ******** 1
投资组合表
-----------------------------------
PID UID TITLE STATUS
-----------------------------------
1 1 title 1 1
2 1 title 2 1
3 1 title 3 1
4 2 title 1 1
----------------------------------
UID USERNAME PORTFOLIO
----------------------------------
1 manoj JSON OBJECT OF PID (1,2,3)
2 testing JOSN OBJECT OF PID (4)
3 user NULL
4 company NULL
目前我正在尝试使用
SELECT u.uid,u.username,(SELECT * FROM portfolio p WHERE u.UID=p.UID) as portfolio FROM users u
这个问题有解决办法吗?
最佳答案
有点复杂,但您可以为每一行创建 JSON 对象,使用 GROUP_CONCAT
连接它们并转换结果(包装在 []
中使其成为一个数组)到 JSON;
SELECT u.uid, u.username,
CASE WHEN p.uid IS NULL
THEN NULL
ELSE CAST(CONCAT('[',
GROUP_CONCAT(JSON_OBJECT('pid', p.pid,
'title', p.title,
'status', p.status)),
']') AS JSON) END portfolios
FROM user u
LEFT JOIN portfolio p
ON u.uid=p.uid
WHERE p.status = 1
GROUP BY u.uid, u.username;
...这给出...
+------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
| 1 | manoj | [{"pid": 1, "title": "title 1", "status": 1}, {"pid": 2, "title": "title 2", "status": 1}, {"pid": 3, "title": "title 3", "status": 1}] |
| 2 | testing | [{"pid": 4, "title": "title 1", "status": 1}] |
| 3 | user | NULL |
| 4 | company | NULL |
+------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
如果您使用的是不支持 JSON 的旧版 MySQL,您可以将其构建为字符串;
SELECT u.uid, u.username,
CASE WHEN p.uid IS NULL
THEN NULL
ELSE CONCAT('[',
GROUP_CONCAT(CONCAT('{ "pid":',p.pid,',"title":"', REPLACE(p.title, '"', '\\"'),
'","status":',p.status, ' }')), ']') END portfolios
FROM user u
LEFT JOIN portfolio p
ON u.uid=p.uid AND p.status=1
GROUP BY u.uid, u.username;
...这会给你...
+------+----------+------------------------------------------------------------------------------------------------------------------------------+
| uid | username | portfolios |
+------+----------+------------------------------------------------------------------------------------------------------------------------------+
| 1 | manoj | [{ "pid":2,"title":"title 2","status":1 },{ "pid":3,"title":"title 3","status":1 },{ "pid":1,"title":"title 1","status":1 }] |
| 2 | testing | [{ "pid":4,"title":"title 1","status":1 }] |
| 3 | user | NULL |
| 4 | company | NULL |
+------+----------+------------------------------------------------------------------------------------------------------------------------------+
关于mysql - 如果子查询在 MySQL 中返回多于 1 行,如何将 JSON 放入列数据中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36350058/