简体   繁体   English

MySQL仅显示唯一行

[英]MySQL display only unique rows

I have a query: 我有一个查询:

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;

In table 'OGLOSZENIA' I have one record. 在“ OGLOSZENIA”表中,我有一个记录。 In Table 'ZDJECIA' I have two records. 在“ ZDJECIA”表中,我有两个记录。

'ZDJECIA': 'ZDJECIA':

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

My query displays two rows, one with test1.jpg, second with test2.jpg. 我的查询显示两行,一行包含test1.jpg,第二行包含test2.jpg。 I don't know how display only one row with first row in 'ZDJECIA' (only test1.jpg); 我不知道如何在“ ZDJECIA”中仅显示第一行的内容(仅显示test1.jpg);

Did not know which one is the ID .. took Opis as ID ;) 不知道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;

You need to specify more carefully what you want. 您需要更仔细地指定所需的内容。

Judging from your comment that 'there will be many rows in table Ogloszenia but you need to use one record from Zdjecia' (paraphrasing), it sounds as if you want one row from Zdjecia for each ID in Ogloszenia. 根据您的评论判断,“表Ogloszenia中将有很多行,但您需要使用Zdjecia中的一条记录”(改写),听起来好像您想要从Zdjecia中为Ogloszenia中的每个ID排一行。 If that's the case, you need to decide which row is appropriate. 如果是这样,您需要确定哪一行是合适的。 For example, it might be the row with the smallest ID value. 例如,它可能是ID值最小的行。

Rewriting your original query with JOIN notation (as recommended in a comment), I get: 用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;

Now we need to put a modestly complex sub-query in place on the Zdjecia table. 现在我们需要在Zdjecia表上放置一个适度复杂的子查询。

The sub-query needs to find the Z.Zdjecie value corresponding to the minimum ID value for each ID_ogloszenia: 子查询需要找到与每个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

So we embed that into the main query: 因此,我们将其嵌入到主查询中:

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;

Since the sub-query returns just one row per ID_ogloszenia, there will only be one row returned in the main query. 由于子查询每个ID_ogloszenia仅返回一行,因此主查询中将仅返回一行。 If you don't like the MIN() , you can use MAX() or any other single-valued aggregate. 如果您不喜欢MIN() ,则可以使用MAX()或任何其他单值聚合。

Use LIMIT 1 instead of 3 at the end of your query. 在查询末尾使用LIMIT 1而不是3。 This tells MySQL to return only the first result. 这告诉MySQL仅返回第一个结果。

Here is a documentation that explains more about LIMIT : http://dev.mysql.com/doc/refman/5.6/en/limit-optimization.html 这是一个文档,解释了更多有关LIMIThttp : //dev.mysql.com/doc/refman/5.6/en/limit-optimization.html

Good luck. 祝好运。

You need to make your query more precise if you only want 1 row to be returned. 如果只想返回1行,则需要使查询更精确。 This means adding another WHERE condition in your query. 这意味着在查询中添加另一个WHERE条件。

Right now, the query that you're giving it is returning 2 rows. 现在,您提供的查询将返回2行。 It's returning exactly what you're asking for. 它正好返回您的要求。

If you set LIMIT = 1, there's no guarantee whether or not you will get test1.jpg returned or test2.jpg returned, since your ORDER BY clause is ordering based on Id_ogloszenia, which is the same for both rows. 如果将LIMIT设置为1,则无法保证返回的是test1.jpg还是返回的test2.jpg,因为您的ORDER BY子句基于Id_ogloszenia进行排序,这对于两行都是相同的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM