2013-04-29 58 views
1

我遇到了一個問題,我找不出爲什麼會給我帶來麻煩。在MySQL中選擇不同的行

我想用DISTINCT語句選擇數據庫中的所有商品,因此每個商品ID都是唯一的。下面是我在截圖的形式登上的Navicat:

Screenshot http://www.dreshar.com/sql.jpg http://www.dreshar.com/sql.jpg

對於任何人誰看不到圖像,這是選擇 - 哪裏是我的錯誤?

SELECT DISTINCT 
guf_offers.id as OfferId, 
guf_offers.validfrom AS OfferValidFrom, 
guf_offers.validtill AS OfferValidTill, 
guf_offers.days AS OfferDays, 
guf_offers.active, 
guf_offers.roomtype1 AS OfferRoomtype1, 
guf_offers.roomprice1 AS OfferRoomprice1, 
guf_countries.caption AS CountryCaption, 
guf_courts.caption AS CourtCaption, 
guf_hotels.caption AS HotelCaption, 
guf_hotels.id AS HotelId, 
guf_hotel_images.image AS HotelImage, 
guf_offer_types.caption AS OffertypeCaption, 
guf_regions.caption AS RegionCaption, 
guf_offers.hoteloncourse AS OfferHotelOnCourse, 
guf_offers.wellnessspa AS OfferWellnessSpa, 
guf_offers.18hole AS Offer18Hole, 
guf_offers.topangebot AS OfferTopangebot 
FROM guf_offers , guf_countries , guf_courts , guf_hotels , guf_hotel_images , guf_offer_types , guf_regions 
WHERE guf_offers.country_id = guf_countries.id AND guf_offers.court_id = guf_courts.id AND guf_offers.hotel_id = guf_hotels.id AND guf_hotel_images.hotel_id = guf_offers.hotel_id AND guf_offers.offer_type_id = guf_offer_types.id AND guf_offers.region_id = guf_regions.id AND guf_offers.active = 1 AND STR_TO_DATE(guf_offers.validtill, '%d.%m.%Y') > STR_TO_DATE('29.04.2013', '%d.%m.%Y') 

回答

2

DISTINCT返回任何不同的組合列。例如,圖像中OfferId = 89的前兩個實例在HotelImage列中顯示不同的值,因此這些是DISTINCT結果。

+1

你說得對 - 我明白。有沒有可能告訴SQL只選擇第一個結果,所以我只會得到第一個找到的圖像? – Dreshar 2013-04-29 16:52:22

+0

是的,但您必須指定第一個結果的含義。例如, – 2013-04-29 17:07:32

+0

。對於每個結果,請選擇hotel_images中顯示的第一個圖像以顯示在結果網站上 – Dreshar 2013-04-29 17:12:53

1

如果你想要不同的ID,那麼你可能想要使用group by。查詢看起來是這樣的:

SELECT 
guf_offers.id as OfferId, 
guf_offers.validfrom AS OfferValidFrom, 
guf_offers.validtill AS OfferValidTill, 
guf_offers.days AS OfferDays, 
guf_offers.active, 
guf_offers.roomtype1 AS OfferRoomtype1, 
guf_offers.roomprice1 AS OfferRoomprice1, 
guf_countries.caption AS CountryCaption, 
guf_courts.caption AS CourtCaption, 
guf_hotels.caption AS HotelCaption, 
guf_hotels.id AS HotelId, 
guf_hotel_images.image AS HotelImage, 
guf_offer_types.caption AS OffertypeCaption, 
guf_regions.caption AS RegionCaption, 
guf_offers.hoteloncourse AS OfferHotelOnCourse, 
guf_offers.wellnessspa AS OfferWellnessSpa, 
guf_offers.18hole AS Offer18Hole, 
guf_offers.topangebot AS OfferTopangebot 
FROM guf_offers , guf_countries , guf_courts , guf_hotels , guf_hotel_images , guf_offer_types , guf_regions 
WHERE guf_offers.country_id = guf_countries.id AND guf_offers.court_id = guf_courts.id AND guf_offers.hotel_id = guf_hotels.id AND guf_hotel_images.hotel_id = guf_offers.hotel_id AND guf_offers.offer_type_id = guf_offer_types.id AND guf_offers.region_id = guf_regions.id AND guf_offers.active = 1 AND STR_TO_DATE(guf_offers.validtill, '%d.%m.%Y') > STR_TO_DATE('29.04.2013', '%d.%m.%Y') 
group by guf_offers.id 

其他列來自不同的行任意值。這使用group by的擴展名,其中列可以在select中,即使它們不在聚合函數或group by子句中。

順便說一下,您應該學會使用propoer join語法來練習from子句中的連接。它使查詢更具可讀性和可維護性。

+0

嗨,謝謝你的幫助。我想要做的是以下幾點:我需要放在一個結果頁面,我需要從不同的表格中獲取信息,例如圖像,國家名稱,地區名稱等 - 我需要的是: 列出所有優惠(guf_offers )並將商品表上的ID與其他表格進行匹配,例如guf_offers.hotel_id => guf_hotels.id並獲取酒店名稱。 然後,我嘗試通過將guf_offers.hotel_id中的id傳遞給guf_hotel_images.hotel_id從表guf_hotel_images中獲得適合的圖像 - 問題是酒店有許多圖像 - >循環 – Dreshar 2013-04-29 18:08:45