如果子查询有多个结果,如何从select语句中的子查询返回一行?

dkqlctbz  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(486)

我有个问题:

  1. select a.*, b.*, (select c.* from tableC c where c.id_tableA = a.id) from tableA a inner join tableB b on a.id = b.id_tableA where b.id_user = 50;

子查询(即tablec)按预期返回了不止一行。如何从tablec中只返回一行,以便与查询的其余部分匹配?
到目前为止,我已经尝试过:

  1. (select c.* from tableC c where c.id_tableA = a.id limit 1)

它没有像mysql说的那样工作:
“操作数应包含1列”

mcdcgff0

mcdcgff01#

如果表c中的列id是主键,那么它应该没有问题,但是如果不是,请尝试添加另一个条件来过滤子查询结果,例如,
例如,以下是开始日期:

  1. SELECT a.column_1, b.column_2,
  2. (SELECT column_3 FROM tableC
  3. WHERE (id = a.id
  4. AND (start_date = (SELECT MAX(b.start_date)
  5. from tableC as c
  6. where a.id = c.id ))) AS column_3
  7. FROM tableA as a INNER JOIN
  8. tableB as b ON b.id = a.id
  9. WHERE b.id_user = 50;
of1yzvn4

of1yzvn42#

你在混合两种东西。中的标量子查询 SELECT 列表应该只返回一个值(行和列)。使用 LIMIT 1 将得到一行,但仍有许多列。因此可以指定列名:

  1. select a.*, b.*,
  2. (select c.col_name from tableC c where c.id_tableA = a.id order by .. limit 1)
  3. from tableA a
  4. inner join tableB b on a.id = b.id_tableA
  5. where b.id_user = 50;

或者用普通的 JOIN :

  1. select a.*, b.*, c.*
  2. from tableA a
  3. inner join tableB b
  4. on a.id = b.id_tableA
  5. left join tableC c
  6. on c.id_tableA = a.id
  7. where b.id_user = 50;

相关问题