我有3个表:Regions,realestate和one-many realestate_regions表。
我需要按地址搜索房地产。我有以下选择查询:
SELECT re.id, GROUP_CONCAT( r.name ) AS address
FROM realestate re
JOIN realestate_regions rr ON re.id = rr.reid
LEFT JOIN regions r ON rr.rid = r.id
WHERE ( re.id LIKE 'san%' OR r.name LIKE 'san%')
GROUP BY re.id;
这给了我以下结果:
+----+---------------+
| id | address |
+----+---------------+
| 1 | San Francisco |
+----+---------------+
但我需要的是:
+----+------------------------+
| id | address |
+----+------------------------+
| 1 | USA, CA, San Francisco |
+----+------------------------+
由于LIKE条件,查询仅返回区域表中匹配的行,而不是全部,这是合乎逻辑的。所以我为类似条件包含了单独的JOIN。
SELECT re.id, GROUP_CONCAT( r.name ) AS address
FROM realestate re
JOIN realestate_regions rr ON re.id = rr.reid
LEFT JOIN regions r ON rr.rid = r.id
LEFT JOIN regions r2 ON rr.rid = r2.id
WHERE ( re.id LIKE 'san%' OR r2.name LIKE 'san%')
GROUP BY re.id;
希望这会保留第一个JOIN及其GROUP_CONCAT包含所有行并仅在第二个JOIN上运行条件,但不是,我得到完全相同的结果。
如何获取完整地址并能够使用LIKE条件过滤结果?
表格
CREATE TABLE `realestate` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`random_data` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `regions` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `realestate_regions` (
`rid` int(11) unsigned NOT NULL,
`reid` int(11) unsigned NOT NULL,
PRIMARY KEY (`rid`,`oid`),
CONSTRAINT `realestate_regions_ibfk_2` FOREIGN KEY (`reid`) REFERENCES `realestate` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `realestate_regions_ibfk_1` FOREIGN KEY (`rid`) REFERENCES `regions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
示例数据:
表1:房地产。主表包含大部分数据。有更多的列,但为了清楚起见,我将这些列从示例中删除。
+----+--------------+
| id | random_data |
+----+--------------+
| 1 | object A |
| 2 | object B |
+----+--------------+
表2 区域。该表由各种地址字符串组成。
+----+---------------+
| id | name |
+----+---------------+
| 1 | USA |
| 2 | CA |
| 3 | San Francisco |
| 4 | Los Angeles |
+----+---------------+
表3: realestate_regions。将地址字符串连接到对象的一对多表。
+-----+-----+
| rid | reid|
+-----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 1 | 2 |
| 2 | 2 |
| 4 | 2 |
+-----+-----+
答案 0 :(得分:1)
问题是您需要在群组结束后发生的位置这是使用子选择的一种方式
Select * from (
SELECT re.id, GROUP_CONCAT( r.name ) AS address
FROM realestate re
JOIN realestate_regions rr
ON re.id = rr.reid
LEFT JOIN regions r
ON rr.rid = r.id
GROUP BY re.id) b
WHERE (Address LIKE '%san%')
另一个......以及更多的标准是使用在计算聚合之后适用的。
SELECT re.id, GROUP_CONCAT( r.name ) AS address
FROM realestate re
JOIN realestate_regions rr
ON re.id = rr.reid
LEFT JOIN regions r
ON rr.rid = r.id
GROUP BY re.id
Having address like '%san%'
我仍然无法证明遇到多条记录时group_concat的顺序是一致的。