mysql - 子查询的一般混淆
问题描述
我有一个看起来像这样的表(示例)
table1
id | datab | datac
1 | 5 | 10
2 | 5 | 10
3 | 9 | 10
和第二个表 table2,其中 ptid 等于第一个表中的 id
table2
id | ptid | dataz
1 | 1 | 99999
2 | 1 | 848483
3 | 1 | 11111
4 | 2 | 76543
我想返回表 2 中 t1.id=t2.ptid 的所有值,而不需要 SQL 创建一个完整的新行,每个 t2 都有一个重复的 t1 记录,就像我通过连接得到的一样。
这似乎是一个绝对基本的 SQL 情况。我尝试使用子选择
SELECT t1.id,
(SELECT t2.dataz
FROM table2 AS t2
WHERE t1.id=t2.ptid
)
FROM table1 AS t1
WHERE t1.id IN (1,2)
现在 SQL 说返回多行时出错,这是我认为我想要它做的。但可能 SQL 不知道如何处理这样返回的多行(您可能不能连续一行)。所以,显然这不起作用。
我想看到发生的是子选择查询返回的东西我可以变成从该子选择返回的所有值的数组,所以我可以通过 PHP 将它传递给 javascript 并使用。
我过去一直在做的是为每个子查询创建一个又一个函数并使用主查询的 ID 进行查询,然后将子查询结果合并到一个数组中,该数组将被传递并合并到主查询中以创建多维数组我想。这似乎效率低下,我相信这个问题有一个更优雅的解决方案。
做这样的事情的最有效方法是什么,实际上有效?
我不知道它是否有任何区别,但我在我的非示例代码中使用 PHP MySQLI 和准备好的语句。
解决方案
这个问题不清楚,但我怀疑这是你想要的:
SELECT t1.id, GROUP_CONCAT(t2.dataz) AS dataz
FROM table1 AS t1
JOIN table2 AS t2 ON t1.id = t2.ptid
WHERE t1.id in (1, 2)
GROUP BY t1.id
GROUP_CONCAT(t2.dataz)
将创建所有t2.dataz
值的逗号分隔字符串。
id dataz
1 99999,848483,11111
2 76543
推荐阅读
- ckeditor5 - 我怎样才能弄清楚为什么我的工具栏只有一个项目
- r - 如何将 char 列表转换为 R 中的整数列表?
- php - PHP 8 没有显示 short_open_tag 设置
- reactjs - 自定义挂钩的目的是什么?
- python - Using pytest-mock to mock objects and object methods
- node.js - 使用firebase Auth在服务器端登录但不在客户端
- go - 通过 socks5h 代理获取
- android - 如何在没有 Root 的 Android 11 上安装 HttpCanary 证书
- java - 一段时间后关闭警报对话框
- azure - 发布到市场的 Azure 托管应用程序无法向自定义提供程序发出 POST 请求(由于招摇而被阻止?)