0

これが私の質問です。その意図はanimals、2匹の動物の一致を構成するのプロパティへのアクセスを許可することです。

一致テーブルには、どの動物が一致を構成するかを格納するための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 

または、* を単一の列名に置き換えるだけです。ただし、この場合、サブクエリが常に 1 行のみを返すようにする必要があります。

また、エイリアスを使用して、次のようにフィールドを区切ることもできます。

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

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 を使用すると、必要な列を選択して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
于 2012-04-08T05:21:55.243 に答える