首页 > 解决方案 > 子查询的一般混淆

问题描述

我有一个看起来像这样的表(示例)

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 和准备好的语句。

标签: mysqlsql

解决方案


这个问题不清楚,但我怀疑这是你想要的:

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

推荐阅读