簡體   English   中英

MySQL僅顯示唯一行

[英]MySQL display only unique rows

我有一個查詢:

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);

不知道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;

您需要更仔細地指定所需的內容。

根據您的評論判斷,“表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()或任何其他單值聚合。

在查詢末尾使用LIMIT 1而不是3。 這告訴MySQL僅返回第一個結果。

這是一個文檔,解釋了更多有關LIMIThttp : //dev.mysql.com/doc/refman/5.6/en/limit-optimization.html

祝好運。

如果只想返回1行,則需要使查詢更精確。 這意味着在查詢中添加另一個WHERE條件。

現在,您提供的查詢將返回2行。 它正好返回您的要求。

如果將LIMIT設置為1,則無法保證返回的是test1.jpg還是返回的test2.jpg,因為您的ORDER BY子句基於Id_ogloszenia進行排序,這對於兩行都是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM