简体   繁体   中英

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. In Table 'ZDJECIA' I have two records.

'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. I don't know how display only one row with first row in 'ZDJECIA' (only test1.jpg);

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

Rewriting your original query with JOIN notation (as recommended in a comment), I get:

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.

The sub-query needs to find the Z.Zdjecie value corresponding to the minimum ID value for each ID_ogloszenia:

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. If you don't like the MIN() , you can use MAX() or any other single-valued aggregate.

Use LIMIT 1 instead of 3 at the end of your query. This tells MySQL to return only the first result.

Here is a documentation that explains more about LIMIT : http://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. This means adding another WHERE condition in your query.

Right now, the query that you're giving it is returning 2 rows. 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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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