我想返回所有符合两个子Queries指定的两个标准中的任何place_id
s。这些子征服中的每一个都可以返回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
完成,但不知道自己该怎么做。
您可以使用:
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))
尝试以下脚本:
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
无需加入,无需分组。
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))
似乎是您的内部查询要重新删除多行,因此此错误会出现。
您可以在选择查询中使用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
可能会帮助您
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
我真的不认为,当您加入同一张表时,只需使用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)
也使用没有汇总功能的组也不是个好主意,因此我使用了独特的方式。另一个我看不到 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))