来自JOIN子句的MySQL LIKE和GROUP_CONCAT只返回连接表中的一行

时间:2014-06-25 18:00:46

标签: mysql join group-concat sql-like

我有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 |
+-----+-----+

1 个答案:

答案 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的顺序是一致的。