我会尽力解释事情。 我有以下查询来从不同的表中获取记录。
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
中获取与此案例p.id
中的属性id匹配的逗号分隔价格。如果sc_commercial_property_price
中存在属性记录,则以逗号分隔的形式和其他记录一起获取它们。如果不是,它应该返回空白。我在这里做错了什么?
如果我的问题不明确,我会再次解释。提前致谢
答案 0 :(得分:1)
添加GROUP BY
子句枚举您想要具有单独行的任何内容。现在发生的是,它为每个结果列选择一些值,并为group_concat
选择pr.price
。
答案 1 :(得分:1)
GROUP_CONCAT
是一个聚合函数。当您包含它时,您告诉SQL存在聚合。如果没有GROUP BY
,则只返回一行,如:
select count(*)
from table
您拥有的查询在MySQL中是可接受的语法,但在任何其他数据库中都不是。查询不会按没有功能的列自动分组。相反,它返回一个任意值。你可以想象一个函数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
子句中包含所有变量组是一种很好的形式,即使MySQL并不一定要求这样做。