[英]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仅返回第一个结果。
这是一个文档,解释了更多有关LIMIT
: http : //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.