1

私は求人広告のウェブアプリを構築しています(これは私の最初のプロのPHPアプリです)。広告と各広告の画像を含むテーブルがあります。各広告には最大4つの画像を含めることができます。広告ごとに1つの画像のみを追加している間は、すべて正常に機能しました。これで、広告ごとに複数の画像を広告すると、その広告がリストで繰り返されます(画像ごとに1回)。これが私が使用しているSQLです:

SELECT 
sun_classified_ads.ad_id, 
sun_classified_ads.insertion_datetime, 
sun_classified_ads.title,                
sun_classified_ads.description, 
sun_classified_ads.maker, 
sun_classified_ads.model, 
sun_classified_ads.location, 
sun_classified_ads.price, 
sun_classified_ads_images.filename_mini, 
sun_classified_ads_images.size_attr_mini, 
sun_classified_ads_images.description AS image_description
FROM sun_classified_ads
INNER JOIN sun_classified_ads_images ON sun_classified_ads.ad_id =       sun_classified_ads_images.ad_id

sun_classified_ads_imagesテーブルのその広告の最初の画像のみを使用するようにするにはどうすればよいですか?

4

3 に答える 3

2

MySQLには、非表示列と呼ばれる「機能」があります。次を使用して、広告ごとに1つの画像を取得できます。

SELECT 
sun_classified_ads.ad_id, 
sun_classified_ads.insertion_datetime, 
sun_classified_ads.title,                
sun_classified_ads.description, 
sun_classified_ads.maker, 
sun_classified_ads.model, 
sun_classified_ads.location, 
sun_classified_ads.price, 
sun_classified_ads_images.filename_mini, 
sun_classified_ads_images.size_attr_mini, 
sun_classified_ads_images.description AS image_description
FROM sun_classified_ads
INNER JOIN sun_classified_ads_images ON sun_classified_ads.ad_id =       sun_classified_ads_images.ad_id
group by sun_classified_ads.ad_id

注意してください。これが最初の広告を返すという保証はありません。画像の3つのフィールドが実際に同じレコードからのものであるという保証はありません(実際にはそうですが)。ただし、これはおそらく、必要なものを取得するための最も簡単な方法です。

次のクエリは必要な処理を実行しますが、もう少し作業が必要です。

SELECT 
sun_classified_ads.ad_id, 
sun_classified_ads.insertion_datetime, 
sun_classified_ads.title,                
sun_classified_ads.description, 
sun_classified_ads.maker, 
sun_classified_ads.model, 
sun_classified_ads.location, 
sun_classified_ads.price, 
substring_index(group_concat(sun_classified_ads_images.filename_mini order by ad_image_id), ',', 1), 
substring_index(group_concat(sun_classified_ads_images.size_attr_mini order by ad_image_id), ',', 1), 
substring_index(group_concat(sun_classified_ads_images.description order by ad_image_id), ',', 1) AS image_description
FROM sun_classified_ads
INNER JOIN sun_classified_ads_images ON sun_classified_ads.ad_id =       sun_classified_ads_images.ad_id
group by sun_classified_ads.ad_id

ad_image_idこれは、が画像の順序を定義するために使用できるフィールドであることを前提としています。

于 2013-01-30T02:52:56.023 に答える
1

datetimeがいつimage追加されるかについて、テーブルにあるかどうかについては述べていません。その場合は、以下のクエリを変更して、min()各広告の日付を返すことができます。

そうでない場合でも、次を使用できる可能性があります。

SELECT 
  a.ad_id, 
  a.insertion_datetime, 
  a.title,                
  a.description, 
  a.maker, 
  a.model, 
  a.location, 
  a.price, 
  i.filename_mini, 
  i.size_attr_mini, 
  i.description AS image_description
FROM sun_classified_ads a
INNER JOIN
(
  select min(ad_id) Min_Ad_id, ad_id
  from sun_classified_ads_images i
  group by ad_id
) i
  ON a.ad_id = i.ad_id
INNER JOIN sun_classified_ads_images i2
  ON a.ad_id = i2.ad_id
  and i.Min_Ad_id = i2.ad_id

画像テーブルにが含まれている場合はdatetime、次を使用できます。

INNER JOIN
(
  select min(ad_date) Min_Ad_Date, ad_id
  from sun_classified_ads_images i
  group by ad_id
) i
  ON a.ad_id = i.ad_id
INNER JOIN sun_classified_ads_images i2
  ON a.ad_id = i2.ad_id
  and i.Min_Ad_Date = i2.ad_date
于 2013-01-30T02:51:25.813 に答える
0

簡単な答えは「できません」です。作成したクエリは、一致したすべてのデータのすべての行を返します。データは画像ごとに1回一致します。2つのクエリを実行する必要があります。1つはすべての広告を取得するためのもので、もう1つはページ内のすべての画像をクエリするためのものです。それが最も簡単な方法です。

于 2013-01-30T02:48:30.380 に答える