MySQL只显示唯一的行

时间:2012-01-21 02:26:20

标签: 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);

4 个答案:

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

答案 1 :(得分: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()或任何其他单值聚合。

答案 2 :(得分:0)

在查询结束时使用LIMIT 1而不是3。这告诉MySQL只返回第一个结果。

以下文档详细介绍了LIMIThttp://dev.mysql.com/doc/refman/5.6/en/limit-optimization.html

祝你好运。

答案 3 :(得分:0)

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

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

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