0

我会尽可能多地解释事情。我有以下查询来从不同的表中获取记录。

SELECT 
  p.p_name,
  p.id,
  cat.cat_name,
  p.property_type,
  p.p_type,
  p.address,
  c.client_name,
  p.price,
  GROUP_CONCAT(pr.price) AS c_price,
  pd.land_area,
  pd.land_area_rp,
  p.tagline,
  p.map_location,
  r.id,
  p.status,
  co.country_name,
  p.`show`,
  u.name,
  p.created_date,
  p.updated_dt,
  o.type_id,
  p.furnished,
  p.expiry_date 
FROM
  property p 
  LEFT OUTER JOIN region AS r 
    ON p.district_id = r.id 
  LEFT OUTER JOIN country AS co 
    ON p.country_id = co.country_id 
  LEFT OUTER JOIN property_category AS cat 
    ON p.cat_id = cat.id 
  LEFT OUTER JOIN property_area_details AS pd 
    ON p.id = pd.property_id 
  LEFT OUTER JOIN sc_clients AS c 
    ON p.client_id = c.client_id 
  LEFT OUTER JOIN admin AS u 
    ON p.adminid = u.id 
  LEFT OUTER JOIN sc_property_orientation_type AS o 
    ON p.orientation_type = o.type_id 
  LEFT OUTER JOIN property_amenities_details AS pad 
    ON p.id = pad.property_id 
  LEFT OUTER JOIN sc_commercial_property_price AS pr 
    ON p.id = pr.property_id 
WHERE p.id > 0 
  AND (
    p.created_date > DATE_SUB(NOW(), INTERVAL 1 YEAR) 
    OR p.updated_dt > DATE_SUB(NOW(), INTERVAL 1 YEAR)
  ) 
  AND p.p_type = 'sale' 

GROUP_CONCAT(pr.price) AS c_price,如果我从上述查询中排除,一切正常。但是当我把它包括在内时,它只会给出一个结果。我在上面使用 group concat 的意图是从sc_commercial_property_price在这种情况下与属性 id 匹配的表中获取逗号分隔的价格p.id。如果属性记录存在,sc_commercial_property_price则以逗号分隔的形式与其他记录一起获取它们。如果不是,它应该返回空白。我在这里做错了什么?

如果我的问题不清楚,我会尝试再次解释。提前致谢

4

2 回答 2

1

添加GROUP BY子句枚举您打算为其设置单独的行的任何内容。现在发生的是它为每个结果列和s every选择一些值。group_concatpr.price

于 2012-09-24T17:21:17.513 回答
1

GROUP_CONCAT一个聚合函数。包含它时,您是在告诉 SQL 存在聚合。如果没有 a GROUP BY,则只返回一行,如下所示:

select count(*)
from table

您拥有的查询在 MySQL 中是可接受的语法,但在任何其他数据库中都不是。查询不会自动按没有函数的列分组。相反,它返回一个任意值。你可以想象一个 function ANY,所以你查询的是:

select any(p.p_name) as p_num, any(p.tagline) as tagline, . . .

要解决此问题,请将所有当前变量放在 group by 子句中:

GROUP BY
  p.p_name,
  p.id,
  cat.cat_name,
  p.property_type,
  p.p_type,
  p.address,
  c.client_name,
  p.price,
  pd.land_area,
  pd.land_area_rp,
  p.tagline,
  p.map_location,
  r.id,
  p.status,
  co.country_name,
  p.`show`,
  u.name,
  p.created_date,
  p.updated_dt,
  o.type_id,
  p.furnished,
  p.expiry_date 

大多数编写 SQL 的人认为在group by子句中包含所有 group by 变量是一种很好的形式,尽管 MySQL 不一定要求这样做。

于 2012-09-24T18:03:15.917 回答