这是我的查询。它的目的是允许访问构成两只动物匹配的animals
属性。
匹配表包含animal1ID和animal2ID的列,用于存储哪些动物构成匹配。
SELECT id,
(SELECT *
FROM animals
WHERE animals.id=matches.animal1ID) AS animal1,
(SELECT *
FROM users
WHERE animals.id=matches.animalID) AS animal2
FROM matches WHERE id=5
但是,MySQl会返回此错误:Operand should contain 1 column(s)
。
为什么呢?是否有另一种方法可以执行此操作,可能使用JOIN语句?
答案 0 :(得分:3)
您不应在SELECT子句中的子查询中使用*。以这种方式重写您的查询:
SELECT m.id, a1.*, a2.*
FROM matches as m
LEFT JOIN animals as a1
on a1.id=m.animal1ID
LEFT JOIN users as a2
on a2.id=m.animalID
WHERE m.id=5
或者,只需用单列名称替换*即可。但是,在这种情况下,您必须确保您的子查询始终只返回一行。
此外,您可以使用别名以这样的方式分隔字段:
SELECT m.id, a1.name as an1_name, a2.name as a2_name, a1.some_field as blabla ...
您可以在获取PHP之前比较查询结果,只需在WHERE子句中添加如下内容:
...
WHERE m.id=5
AND a1.name <> a2.name -- or what you want
答案 1 :(得分:2)
更像这样的事情:
SELECT id,
animals.*,
users.*
FROM matches
JOIN animals
ON animals.id=matches.animal1ID
JOIN users
ON users.id=matches.animalID
WHERE id=5
如果无法保证animals
或users
,您可以使用LEFT JOIN
SELECT id,
animals.*,
users.*
FROM matches
LEFT JOIN animals
ON animals.id=matches.animal1ID
LEFT JOIN users
ON users.id=matches.animalID
WHERE id=5
通过这些JOINS,您可以从animals
和users
SELECT id,
animals.animalName AS AnimalName,
users.animalName AS UserAnimalName
FROM matches
(LEFT) JOIN animals
ON animals.id=matches.animal1ID
(LEFT) JOIN users
ON users.id=matches.animalID
WHERE id=5