0

这是我的查询。它的目的是允许访问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 语句?

4

2 回答 2

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
于 2012-04-08T05:22:45.250 回答
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,您可以从中选择所需的任何列,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
于 2012-04-08T05:21:55.243 回答