IN()返回'基数违规:1242子查询返回超过1行'

时间:2017-11-30 09:08:25

标签: mysql sql

我想返回满足两个子查询指定的2个条件中的任何一个的所有place_id。每个子查询都可以返回多于1行,因为我可以有多个地方满足子查询的条件。

SELECT p.place_id
FROM places p
LEFT JOIN rel_place_custom_fields rpcf ON p.place_id = rpcf.place_id 
WHERE rpcf.place_id IN 
    ((SELECT rpcf.place_id FROM rel_place_custom_fields rpcf
      WHERE rpcf.field_id = 29 AND rpcf.field_value = :value_29_0), 
     (SELECT rpcf.place_id FROM rel_place_custom_fields rpcf
      WHERE rpcf.field_id = 29 AND rpcf.field_value = :value_29_1)) 
GROUP BY place_id

它返回以下错误:

  

未捕获的异常:SQLSTATE [21000]:基数违规:1242   子查询返回超过1行

有什么更好的方法呢?我被告知可以用JOIN完成,但不知道如何自己做。

6 个答案:

答案 0 :(得分:2)

您可以使用:

WHERE 
   rpcf.place_id IN (SELECT rpcf.place_id 
                     FROM rel_place_custom_fields rpcf 
                     WHERE rpcf.field_id = 29 AND rpcf.field_value = :value_29_0)

   OR 

   rpcf.place_id IN (SELECT rpcf.place_id 
                     FROM rel_place_custom_fields rpcf 
                     WHERE rpcf.field_id = 29 AND rpcf.field_value = :value_29_1)

或者,甚至更好:

WHERE 
   rpcf.place_id IN (SELECT rpcf.place_id 
                     FROM rel_place_custom_fields rpcf 
                     WHERE rpcf.field_id = 29 AND 
                            rpcf.field_value IN (:value_29_0, :value_29_1))

答案 1 :(得分:1)

尝试以下脚本:

SELECT p.place_id 
FROM places p 
LEFT JOIN rel_place_custom_fields rpcf ON p.place_id = rpcf.place_id 
WHERE rpcf.place_id IN ((SELECT rpcf.place_id 
                         FROM rel_place_custom_fields rpcf 
                         WHERE rpcf.field_id = 29 AND 
                               (rpcf.field_value = :value_29_0 OR
                                rpcf.field_value = :value_29_1)
GROUP BY place_id

答案 2 :(得分:1)

无需加入,无需GROUP BY。

SELECT DISTINCT p.place_id
FROM places p
WHERE p.place_id_id IN 
    (SELECT rpcf.place_id FROM rel_place_custom_fields rpcf
     WHERE rpcf.field_id = 29 AND rpcf.field_value IN (:value_29_0, :value_29_1)) 

答案 3 :(得分:0)

看起来你的内部查询正在撤回多行,因此会出现此错误。

您可以在select查询中使用group_concat以逗号获取所有行,请尝试如下,

SELECT 
  p.place_id 
FROM
  places p 
  LEFT JOIN rel_place_custom_fields rpcf 
    ON p.place_id = rpcf.place_id 
WHERE rpcf.place_id IN (
    (SELECT 
      GROUP_CONCAT(rpcf.place_id) 
    FROM
      rel_place_custom_fields rpcf 
    WHERE rpcf.field_id = 29 
      AND rpcf.field_value = :value_29_0),
    (SELECT 
      GROUP_CONCAT(rpcf.place_id) 
    FROM
      rel_place_custom_fields rpcf 
    WHERE rpcf.field_id = 29 
      AND rpcf.field_value = :value_29_1)
  ) 
GROUP BY place_id 

愿这会帮到你

答案 4 :(得分:0)

SELECT p.place_id
FROM places p
LEFT JOIN rel_place_custom_fields rpcf ON p.place_id = rpcf.place_id 
WHERE rpcf.place_id IN 
    ((SELECT rpcf.place_id FROM rel_place_custom_fields rpcf
      WHERE rpcf.field_id = 29 AND rpcf.field_value IN ('value_29_0','value_29_1')
GROUP BY place_id

答案 5 :(得分:0)

我真的不这么认为当你加入同一个表时只需使用WHERE子句过滤掉你想要的结果就需要子查询。

SELECT DISTINCT p.place_id
FROM places p
JOIN rel_place_custom_fields rpcf ON p.place_id = rpcf.place_id 
WHERE rpcf.field_id = 29
AND rpcf.field_value IN(:value_29_0,:value_29_1)

使用group by而不使用聚合函数也不是一个好主意,所以我使用了distinct而不是。另一个我没有看到使用LEFT加入您的条件,加入INNER加入

另一种做同样的方法就是

SELECT p.place_id
FROM places p
JOIN rel_place_custom_fields rpcf ON p.place_id = rpcf.place_id 
GROUP BY p.place_id
HAVING SUM(rpcf.field_id = 29)
AND SUM(rpcf.field_value IN(:value_29_0,:value_29_1))
相关问题