2012-01-19 8 views
1

私は、クエリを持っているの表示行:DBでのMySQLを選択し、16回

SELECT OGLOSZENIA.Id_ogloszenia, TYP_NADWOZIA.Nazwa_nadwozie, OGLOSZENIA.Opis, 
WOJEWODZTWA.Nazwa_wojewodztwo, OGLOSZENIA.Miasto, OGLOSZENIA.Rocznik, OGLOSZENIA.Cena, 
OGLOSZENIA.id_model, MARKI.Nazwa_marka, MODELE.Nazwa_model, ZDJECIA.Zdjecie, 
SILNIK.Nazwa_silnik, KOLORY.Nazwa_kolor, OGLOSZENIA.Moc, OGLOSZENIA.Pojemnosc 
FROM OGLOSZENIA, MARKI, MODELE, ZDJECIA, WOJEWODZTWA, TYP_NADWOZIA, SILNIK, KOLORY 
WHERE OGLOSZENIA.Id_koloru = KOLORY.Id_koloru AND 
OGLOSZENIA.Id_silnik = SILNIK.Id_silnik AND 
OGLOSZENIA.Id_kategoria = TYP_NADWOZIA.Id_kategoria AND 
MODELE.Id_marka = MARKI.Id_marka AND 
OGLOSZENIA.Id_model = MODELE.Id_model AND 
OGLOSZENIA.Id_ogloszenia = ZDJECIA.Id_ogloszenia 
ORDER BY OGLOSZENIA.Id_ogloszenia DESC; 

は、私が「OGLOSZENIA」内の3行を持っているが、私は、クエリを実行する際に、ディスプレイ48行。 DB表示で1行16回。問題はどこですか?

+0

sryですが、投稿する前に英語の変数に変数を一般化すると、ちょっとした提案 – kiltek

答えて

2

8つのテーブルがありますが、結合条件は6つのみです。 1つの条件がありません。結果はCROSS JOINです。

FROM一部:

FROM OGLOSZENIA, MARKI, MODELE, ZDJECIA 
    , WOJEWODZTWA, TYP_NADWOZIA, SILNIK, KOLORY 
WHERE OGLOSZENIA.Id_koloru = KOLORY.Id_koloru AND 
OGLOSZENIA.Id_silnik = SILNIK.Id_silnik AND 
OGLOSZENIA.Id_kategoria = TYP_NADWOZIA.Id_kategoria AND 
MODELE.Id_marka = MARKI.Id_marka AND 
OGLOSZENIA.Id_model = MODELE.Id_model AND 
OGLOSZENIA.Id_ogloszenia = ZDJECIA.Id_ogloszenia 

は、明示的JOIN構文を使用して記述する必要があります:

FROM OGLOSZENIA 
    JOIN SILNIK ON OGLOSZENIA.Id_silnik = SILNIK.Id_silnik 
    JOIN MODELE ON OGLOSZENIA.Id_model = MODELE.Id_model 
    JOIN MARKI ON MODELE.Id_marka = MARKI.Id_marka 
    JOIN KOLORY ON OGLOSZENIA.Id_koloru = KOLORY.Id_koloru 
    JOIN ZDJECIA ON OGLOSZENIA.Id_ogloszenia = ZDJECIA.Id_ogloszenia 
    JOIN TYP_NADWOZIA ON OGLOSZENIA.Id_kategoria = TYP_NADWOZIA.Id_kategoria 
    JOIN WOJEWODZTWA ON ??? 
+0

ありがとう、今は大丈夫です。 – Pitu

+0

明示的なJOIN構文の別のケース... – gbn

0
SELECT DISTINCT OGLOSZENIA.Id_ogloszenia, TYP_NADWOZIA.Nazwa_nadwozie ... 
+0

DISTINCTは役に立ちません。 – Pitu

1

明示的な結合構文を使用してクエリを書き直す場合ではないすべてがあるとすぐにわかります

SELECT OGLOSZENIA.Id_ogloszenia, TYP_NADWOZIA.Nazwa_nadwozie, OGLOSZENIA.Opis, 
WOJEWODZTWA.Nazwa_wojewodztwo, OGLOSZENIA.Miasto, OGLOSZENIA.Rocznik, OGLOSZENIA.Cena, 
OGLOSZENIA.id_model, MARKI.Nazwa_marka, MODELE.Nazwa_model, ZDJECIA.Zdjecie, 
SILNIK.Nazwa_silnik, KOLORY.Nazwa_kolor, OGLOSZENIA.Moc, OGLOSZENIA.Pojemnosc 

    FROM OGLOSZENIA 
    join MARKI ??? 
    join MODELE on MODELE.Id_marka = MARKI.Id_marka and OGLOSZENIA.Id_model = MODELE.Id_model 
    join ZDJECIA ??? 
    join WOJEWODZTWA on OGLOSZENIA.Id_ogloszenia = ZDJECIA.Id_ogloszenia 
    join TYP_NADWOZIA on OGLOSZENIA.Id_kategoria = TYP_NADWOZIA.Id_kategoria 
    join SILNIK on OGLOSZENIA.Id_silnik = SILNIK.Id_silnik 
    join KOLORY on OGLOSZENIA.Id_koloru = KOLORY.Id_koloru 

ORDER BY OGLOSZENIA.Id_ogloszenia DESC; 

これは、あなたの出力が乗算されているテーブルのいくつかのクロス結合を取得していることを意味します。

明示的なJOIN構文を使用する以外にも、テーブルのエイリアスを使用してクエリをクリーンアップして理解することをお勧めします。ような何か:私はあなたが必要とする結果セットに狭く、テーブルの一部をトリミング示唆して、より多くを追加することになり、前方進めること

SELECT o.Id_ogloszenia, tn.Nazwa_nadwozie, o.Opis, 
w.Nazwa_wojewodztwo, o.Miasto, o.Rocznik, o.Cena, 
o.id_model, mk.Nazwa_marka, mo.Nazwa_model, z.Zdjecie, 
s.Nazwa_silnik, k.Nazwa_kolor, o.Moc, o.Pojemnosc 

    FROM OGLOSZENIA as o 
    join MARKI as mk ??? 
    join MODELE as mo on mo.Id_marka = mk.Id_marka and o.Id_model = mo.Id_model 
    join ZDJECIA as z ??? 
    join WOJEWODZTWA as w on o.Id_ogloszenia = z.Id_ogloszenia -- THIS IS INCORRECT... 
    join TYP_NADWOZIA as tn on o.Id_kategoria = tn.Id_kategoria 
    join SILNIK as s on o.Id_silnik = s.Id_silnik 
    join KOLORY as k on o.Id_koloru = k.Id_koloru 

ORDER BY o.Id_ogloszenia DESC; 

は、最終的なクエリの詳細を取得するために結合します。簡単なものからもっと複雑なものへと繰り返す。