0

私は問題があります。

次のクエリを実行しています。データベースには 1 つのレコードしかありませんが、9 つの結果が得られます。

SELECT c.id, c.rk 
FROM cv AS c, employee AS e , cvCat AS cv_cat 
WHERE c.status=1 
    AND c.empIDFK = e.id 
    AND cv_cat.categoryFK IN ( 17,18,19,38,39,40,41,44,45,46 ) 
    AND cv_cat.cvFK = c.id

このクエリに問題があるかどうかを教えてください。1 つの結果ではなく 9 つの結果が得られるのはなぜですか。

このクエリでは 1 つのレコードしか表示されませんが、9 つの結果が表示されます。

4

3 に答える 3

2

あなたがするとき

FROM cv AS c, employee AS e , cvCat AS cv_cat

3 つのテーブルを暗黙的に結合しています。個別のレコードを取得する場合はDISTINCT、select の後に追加できます。

SELECT DISTINCT c.id, c.rk 
FROM cv AS c, employee AS e , cvCat AS cv_cat 
WHERE c.status=1 
    AND c.empIDFK = e.id 
    AND cv_cat.categoryFK IN ( 17,18,19,38,39,40,41,44,45,46 ) 
    AND cv_cat.cvFK = c.id
于 2012-05-29T19:47:23.883 に答える
2

明示的な結合を使用します。

SELECT c.id, c.rk
FROM cv c
INNER JOIN employee e ON e.id = c.empIDFK
INNER JOIN cvCat cv_cat ON cv_cat.cvFK = c.id
WHERE c.status = 1
AND cv_cat.categoryFK IN (17,18,19,38,39,40,41,44,45,46)
于 2012-05-29T19:49:06.710 に答える
1

9つの結果行の「問題」はJOIN構文に基づいていると思います。この種の暗黙的な結合では、c.idとc.rkのみを取得するため、結合された結果として(各テーブルの)すべての行が返されます。 MySQLが同じ結果を9回送り返したように見えるかもしれません。

補足:暗黙的な結合は、次のような明示的な結合を使用して非推奨になっています...

    SELECT c.id, c.rk
    FROM cv c
    LEFT JOIN employee e ON c.empIDFK = e.id
    LEFT JOIN cvCat cv_cat ON c.id = cv_cat.cvFK
    WHERE...

コードを「将来にわたって利用できる」ようにし、クエリ全体にもう少し自己記述型の構文を追加するのに役立ちます。

于 2012-05-29T20:05:34.163 に答える