【问题标题】:MySQL - Retrieving data without duplicationMySQL - 检索数据而不重复
【发布时间】:2015-01-14 21:39:49
【问题描述】:

所以在我的 SQL 表中我有这种情况。

一个项目(具有唯一 ID)可以有与之关联的照片。

我需要在一条记录(或更准确地说是行)中获取有关一件物品和两张照片的所有信息。

我目前的查询是:

SELECT ultrait_wpl_properties.id, location1_name, location3_name, location4_name, field_312, field_42, post_code, lot_area, living_area, price, bedrooms, bathrooms, field_308, googlemap_lt, googlemap_ln, street, street_no, ultrait_wpl_property_types.name, property_title, build_year, add_date, ultrait_wpl_items.item_name 
    FROM ultrait_wpl_properties 
    JOIN ultrait_wpl_property_types ON ultrait_wpl_properties.property_type = ultrait_wpl_property_types.id 
    JOIN ultrait_wpl_items ON ultrait_wpl_properties.id = ultrait_wpl_items.parent_id 
    ORDER BY ultrait_wpl_properties.id ";

从这个查询中,我得到了我需要的所有信息和图片。我当前方法的问题是,如果有不止一张图片,当我的查询执行时,我会得到一个重复的行。有没有办法解决这个问题?

我稍后会使用此数据并将其导出到一个 xml 文件中,但因为此查询返回每张照片的重复记录。包含一个项目但包含 5 张图片的 XML 文件将返回 5 个相同的节点但具有不同的图片 URL。

【问题讨论】:

  • 你能告诉我们你有什么以及你期望的结果吗?
  • 记录是实际上重复还是ultrait_wpl_items.item_name中的值在每种情况下都不同? (我猜是)
  • 你想要什么结果?只是几张照片中的一张?还是将它们全部列在一行中?还是只有两个?哪两个?
  • 基本上 item_name 是不同的,但其他一切都是一样的,正如你所期望的,但我已经尝试了几个小时,看看是否有办法获取所有字段数据和两个图像没有重复
  • @Blorange2,请澄清。看来ultrait_wpl_properties 中的行与ultraip_wpl_items 中的行之间存在一对多关系。似乎您期望但不能保证每个ultraip_wpl_items 行将恰好有两个ultrait_wpl_properties 行。要正确且稳健地生成结果集,您将需要知道如何区分每个属性的 firstsecond 项。我们无法从您的问题开始告诉您如何做到这一点。这里需要整理一些业务规则来解决这个问题。

标签: php mysql


【解决方案1】:

如下重写您的查询

SELECT DISTINCT
    ultrait_wpl_properties.id,
    location1_name,
    location3_name,
    location4_name,
    field_312,
    field_42,
    post_code,
    lot_area,
    living_area,
    price,
    bedrooms,
    bathrooms,
    field_308,
    googlemap_lt,
    googlemap_ln,
    street,
    street_no,
    ultrait_wpl_property_types.name,
    property_title,
    build_year,
    add_date,
    ultrait_wpl_items.item_name
FROM
    ultrait_wpl_properties
INNER JOIN
    ultrait_wpl_property_types ON
        ultrait_wpl_properties.property_type = ultrait_wpl_property_types.id
INNER JOIN
    ultrait_wpl_items ON 
        ultrait_wpl_properties.id = ultrait_wpl_items.parent_id
ORDER BY
    ultrait_wpl_properties.id

【讨论】:

  • 感谢您的尝试,但我认为我将不得不重新调整我的想法,因为我需要所有领域,但我也需要每张图片。我知道这有点乏味
  • ultrait_wpl_items.item_name 上的值随每条记录而变化,因此它们不同的记录 - 这个答案实际上并不能解决问题。
【解决方案2】:

你可以试试这个。

   SELECT ultrait_wpl_properties.id,
          (all those other columns),
          GROUP_CONCAT(ultrait_wpl_items.item_name) items
     FROM  ultrait_wpl_properties
    INNER JOIN ultrait_wpl_property_types 
              ON ultrait_wpl_properties.property_type = ultrait_wpl_property_types.id
     LEFT JOIN ultrait_wpl_items 
              ON ultrait_wpl_properties.id = ultrait_wpl_items.parent_id
    GROUP BY ultrait_wpl_properties.id

它使用notorious non-standard GROUP BY extension in MySQL,所以它可能会产生稍微奇怪的结果。但它会为每个id 生成一个逗号分隔的item_name 列列表。

LEFT JOIN 使其适用于缺少任何图像的id 值。

【讨论】:

  • 这很好用,但有没有办法将它们分开一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 2014-06-02
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多