我正在构建一个分类广告的web应用程序(这是我的第一个专业PHP应用程序)。我有一个表的广告和其他与每个广告的图像。每个广告最多可以有4张图片。当我在每个广告中只添加一张图片时,一切都很好。现在,当我在每个广告中发布一个以上的图像时,该广告会在列表中重复出现(每个图像一次)。下面是我使用的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表中该广告的第一张图片呢?
发布于 2013-01-30 10:52:56
MySQL有一个名为隐藏列的“功能”。您可以使用以下内容获取每个广告的一张图片:
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只是提醒一下。不能保证这将返回第一个广告。不能保证图像中的三个字段实际上来自相同的记录(尽管在实践中确实是这样)。然而,这可能是获得你想要的最简单的方法。
下面的查询做了您想要做的事情,但是需要做更多的工作:
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-30 10:51:26
您没有说明您的表是否有关于何时添加image的datetime。如果是这样,那么您可以修改下面的查询,以返回每个广告的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-30 10:48:30
简短的回答是“你不能”。您编写的查询将返回所有匹配数据的所有行。对于每个图像,数据匹配一次。您需要执行两个查询--一个用于获取所有广告,另一个用于查询页面上的所有图像。这是最直接的方法。
https://stackoverflow.com/questions/14595848
复制相似问题