У меня есть 3 таблицы: регионы, недвижимость и таблица 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, но нет, я получаю точно такой же результат.
Как я могу получить полный адрес и иметь возможность фильтровать результаты с помощью НРАВИТСЯ условие?
Таблицы:
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 |
+-----+-----+
USA, CA, Los Angeles
, если ваше предложение where равноlike '%san%'
? и как узнать, какой ПОРЯДОК применить к группе concat? - person xQbert   schedule 25.06.2014USA, CA, San Francisco
CA, San Francisco, USA
San FranCisco, USA, CA
Что движет порядком, в котором они представлены, кроме человеческого логического понимания. в данных нет ничего, что могло бы обозначить порядок, который я могу видеть ... - person xQbert   schedule 25.06.2014