首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免笛卡尔乘积的查询?

问如何避免笛卡尔乘积的查询?
EN

Stack Overflow用户
提问于 2013-01-30 10:45:57
回答 3查看 1.5K关注 0票数 1

我正在构建一个分类广告的web应用程序(这是我的第一个专业PHP应用程序)。我有一个表的广告和其他与每个广告的图像。每个广告最多可以有4张图片。当我在每个广告中只添加一张图片时,一切都很好。现在,当我在每个广告中发布一个以上的图像时,该广告会在列表中重复出现(每个图像一次)。下面是我使用的SQL:

代码语言:javascript
复制
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表中该广告的第一张图片呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-30 10:52:56

MySQL有一个名为隐藏列的“功能”。您可以使用以下内容获取每个广告的一张图片:

代码语言:javascript
复制
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

只是提醒一下。不能保证这将返回第一个广告。不能保证图像中的三个字段实际上来自相同的记录(尽管在实践中确实是这样)。然而,这可能是获得你想要的最简单的方法。

下面的查询做了您想要做的事情,但是需要做更多的工作:

代码语言:javascript
复制
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是一个可用于定义图像排序的字段。

票数 2
EN

Stack Overflow用户

发布于 2013-01-30 10:51:26

您没有说明您的表是否有关于何时添加image的datetime。如果是这样,那么您可以修改下面的查询,以返回每个广告的min()日期。

如果不是,那么您可能仍然可以使用以下内容:

代码语言:javascript
复制
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,那么您可以使用:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2013-01-30 10:48:30

简短的回答是“你不能”。您编写的查询将返回所有匹配数据的所有行。对于每个图像,数据匹配一次。您需要执行两个查询--一个用于获取所有广告,另一个用于查询页面上的所有图像。这是最直接的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14595848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档