为什么我收到MySQL错误?

时间:2012-04-08 05:18:03

标签: mysql sql

这是我的查询。它的目的是允许访问构成两只动物匹配的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语句?

2 个答案:

答案 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

如果无法保证animalsusers,您可以使用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,您可以从animalsusers

中选择所需的任何列
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