此问题是Is there a standard way to swap a query from an ID to a different column like 'name'?
的后续问题此查询正常工作:
SELECT manufacturers.id, manufacturers.name, models.model_manufacturer, models.model_part
FROM models
INNER JOIN manufacturers
ON manufacturers.id = models.model_manufacturer
WHERE model_part = (
SELECT parts.id
FROM parts
WHERE parts.name = '{$part_name}')
GROUP BY manufacturers.id
ORDER BY name ASC
但是当遇到具有多个模型的制造商时,这个失败并且“子查询返回超过1行”:
SELECT parts.id, models.id, models.model_part, models.model_manufacturer, models.name, models.year, models.weight
FROM parts
INNER JOIN models
ON parts.id = models.model_part
WHERE model_manufacturer = (
SELECT manufacturers.id
FROM manufacturers
WHERE manufacturers.name = '{$manufacturer_name}')
&& model_part = (
SELECT parts.id
FROM parts
WHERE parts.name = '{$part_name}')
我真正理解的是,如果我只运行工作示例中的子查询,或者在第二个示例中单独运行子查询,它们都会返回单个值。如果我运行整个查询,它们都返回多个值。那么为什么一个错误而另一个错误呢?它可以在myPHPAdmin中正常运行查询,但在我尝试在PHP文件中执行时失败。
答案 0 :(得分:4)
但是这个,当它遇到一个拥有超过一个的制造商 单个模型,失败,“子查询返回超过1行”
MySQL =
运算符可以将1个值与另一个值进行比较。当子查询返回更多,然后是1值时,它会混淆,因为它不知道,可以与之进行比较。
使用IN
运算符代替=
:
SELECT parts.id, models.id,
models.model_part, models.model_manufacturer,
models.name, models.year, models.weight
FROM parts
INNER JOIN models
ON parts.id = models.model_part
WHERE model_manufacturer = (
SELECT manufacturers.id
FROM manufacturers
WHERE manufacturers.name = '{$manufacturer_name}')
&& model_part IN (
SELECT parts.id
FROM parts
WHERE parts.name = '{$part_name}')
对不起,如果我把IN操作员放到错误的位置。但我认为,model_part的第二个子查询是正确的位置。
答案 1 :(得分:1)
IN的上述建议可能是最简单的想法。
我很想将它重新编码为JOIN,但使用DISTINCT删除重复项: -
SELECT DISTINCT parts.id, models.id, models.model_part, models.model_manufacturer, models.name, models.year, models.weight
FROM parts
INNER JOIN models
ON parts.id = models.model_part
INNER JOIN manufacturers
ON models.model_manufacturer = manufacturers.id AND manufacturers.name = '{$manufacturer_name}'
INNER JOIN parts parts2 ON models.model_part = parts2.id AND parts.name = '{$part_name}'