2012-01-21 65 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