MySQL选择并显示16次行

时间:2012-01-19 13:59:38

标签: mysql

我有一个问题:

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;

在DB中,我在'OGLOSZENIA'中有3行,但是当我查询时,显示48行。数据库中的1行显示16次。哪里有问题?

3 个答案:

答案 0 :(得分:2)

您有8个表但只有6个连接条件。缺少一个条件,结果为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  ???

答案 1 :(得分: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;

为了继续前进,我建议修剪一些表格,缩小到您需要的结果集,然后添加更多联接以获取最终查询的详细信息。从简单到复杂的迭代。

答案 2 :(得分:0)

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