2012-01-21 67 views
0

我有一个查询:的MySQL显示唯一行

SELECT DISTINCT ZDJECIA.Id_ogloszenia, OGLOSZENIA.Opis, TYP_NADWOZIA.Nazwa_nadwozie, 
     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 
    AND OGLOSZENIA.Id_wojewodztwa = WOJEWODZTWA.Id_wojewodztwa 
ORDER BY OGLOSZENIA.Id_ogloszenia DESC LIMIT 3; 

在表“OGLOSZENIA”我有一个记录。 在'ZDJECIA'表中我有两个记录。

'ZDJECIA':

Id | Id_ogloszenia | Zdjecie 
1   1   test1.jpg 
2   1   test2.jpg 

我的查询显示两行,一行与test1.jpg,第二与test2.jpg。 我不知道如何在'ZDJECIA'中只显示第一行的一行(只有test1.jpg);

+1

强烈建议:在FROM子句中使用现代JOIN符号而不是旧式逗号列表,并在WHERE子句中加入条件。 –

回答

2

你需要更仔细地你想要的指定。

从您的评论中可以判断'表Ogloszenia中会有很多行,但您需要使用Zdjecia的一条记录'(释义),这听起来好像您要从Zdjecia为Ogloszenia中的每个ID记录一行。如果是这样的话,你需要决定哪一行是合适的。例如,它可能是具有最小ID值的行。

重写原始查询与JOIN符号(如在评论推荐),我得到:

SELECT DISTINCT Z.Id_ogloszenia, O.Opis, T.Nazwa_nadwozie, 
     W.Nazwa_wojewodztwo, O.Miasto, O.Rocznik, 
     O.Cena, O.id_model, I.Nazwa_marka, E.Nazwa_model, 
     Z.Zdjecie, S.Nazwa_silnik, K.Nazwa_kolor, O.Moc, 
     O.Pojemnosc 
    FROM OGLOSZENIA AS O 
    JOIN MODELE  AS E ON O.Id_model  = E.Id_model 
    JOIN MARKI  AS I ON E.Id_marka  = I.Id_marka 
    JOIN ZDJECIA  AS Z ON O.Id_ogloszenia = Z.Id_ogloszenia 
    JOIN WOJEWODZTWA AS W ON O.Id_wojewodztwa = W.Id_wojewodztwa 
    JOIN TYP_NADWOZIA AS T ON O.Id_kategoria = T.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 LIMIT 3; 

现在我们需要把一个复杂的适度子查询的地方就Zdjecia表。

子查询需要找到对应于每个ID_ogloszenia最小ID值Z.Zdjecie值:

SELECT Z1.ID_ogloszenia, Z1.Zdjecie 
    FROM Zdjecia AS Z1 
    JOIN (SELECT Z2.ID_ogloszenia, MIN(Z2.ID) AS ID 
      FROM Zdjecia AS Z2 
     GROUP BY Z2.ID_ogloszenia 
     ) AS Z2 

因此,我们认为嵌入到主查询:

SELECT DISTINCT Z.Id_ogloszenia, O.Opis, T.Nazwa_nadwozie, 
     W.Nazwa_wojewodztwo, O.Miasto, O.Rocznik, 
     O.Cena, O.id_model, I.Nazwa_marka, E.Nazwa_model, 
     Z.Zdjecie, S.Nazwa_silnik, K.Nazwa_kolor, O.Moc, 
     O.Pojemnosc 
    FROM OGLOSZENIA AS O 
    JOIN MODELE  AS E ON O.Id_model  = E.Id_model 
    JOIN MARKI  AS I ON E.Id_marka  = I.Id_marka 
    JOIN (SELECT Z1.ID_ogloszenia, Z1.Zdjecie 
      FROM Zdjecia AS Z1 
      JOIN (SELECT Z2.ID_ogloszenia, MIN(Z2.ID) AS ID 
        FROM Zdjecia AS Z2 
       GROUP BY Z2.ID_ogloszenia 
       ) AS Z2 
     )   AS Z ON O.Id_ogloszenia = Z.Id_ogloszenia 
    JOIN WOJEWODZTWA AS W ON O.Id_wojewodztwa = W.Id_wojewodztwa 
    JOIN TYP_NADWOZIA AS T ON O.Id_kategoria = T.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 LIMIT 3; 

由于子查询每个ID_ogloszenia只返回一行,主查询中只返回一行。如果您不喜欢MIN(),则可以使用MAX()或任何其他单值聚合。

+0

什么是'Z2.ID'?解决方案的优势在哪里? – rauschen

+0

Z2是Zdjecia表的别名,所以Z2.ID是Zdjecia.ID的名称,Zdjecia表中的ID列。如果这个解决方案有一个优点,那就是它给了你正确的答案,但是因为我不确定你所指的是哪个GROUP BY解决方案,所以我可能会失去目标。您可能可以在没有所有子查询的情况下在主查询上执行GROUP BY;你会在SELECT列表中列出类似'MIN(Z.Zdjecie)AS Zdjecie'的东西,并且(如果你不使用MySQL),你必须在GROUP BY子句中列出其他非聚合属性。 MySQL允许你快捷方式,但要小心。 –

0

如果您只想要返回1行,则需要使查询更加精确。这意味着在查询中添加另一个WHERE条件。

现在,您要给它的查询返回2行。它正在返回你所要求的。

如果您设置LIMIT = 1,则不能保证您是否会返回test1.jpg returned或test2.jpg,因为您的ORDER BY子句是基于Id_ogloszenia进行排序的,两者的排序相同。

+0

是的,但是当我在OGLOSZENIA会有更多的记录?我需要在“OGLOSZENIA”中显示一条记录。 – Pitu

2

不知道哪一个是ID ..把OPIS为ID)

SELECT OGLOSZENIA.Opis as ID, ZDJECIA.Id_ogloszenia, ZDJECIA.Zdjecie 
FROM OGLOSZENIA 
LEFT JOIN ZDJECIA ON OGLOSZENIA.Id_ogloszenia = ZDJECIA.Id_ogloszenia 
Group by OGLOSZENIA.Id_ogloszenia 
ORDER BY OGLOSZENIA.Id_ogloszenia DESC LIMIT 3; 
+0

谢谢,“由OGLOSZENIA.Id_ogloszenia组”由其确定。 ;) – Pitu