@juniorspecialist
Джуниор

Как составить запрос на выборку в Mysql?

Здравствуйте. Нужна помощь в запросе. Таблица:
CREATE TABLE `geo_regions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`GeoRegionType` varchar(255) NOT NULL,
`GeoRegionName` varchar(255) NOT NULL,
`GeoRegionId` int(11) NOT NULL,
`ParentId` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `index_georegionid_geo_regions` (`GeoRegionId`),
KEY `index_parendid_geo_regions` (`ParentId`)
) ENGINE=InnoDB AUTO_INCREMENT=823 DEFAULT CHARSET=utf8

Есть список кодов, которые необходимо проверить на наличие в таблице. Т.е. в запросе передаём список кодов и проверяем по полю "GeoRegionId", если указанный код в списке не найден в таблице то выводим эти коды(на каждый код, что не нашли отдельная строка - например код и по остальным полям НУЛЛ).
Например - SELECT t1.*
FROM geo_regions_yandex AS t1
LEFT JOIN geo_regions_yandex AS t2
ON t1.GeoRegionId = t2.GeoRegionId
WHERE t2.GeoRegionId IN (1,2,-1)
В таблице есть коды 1 и 2, но нет кода "-1", поэтому желательно получить в результате что-то вроде "-1".
Мой запрос отрабатывает не верно, находит лишь существующие значения из списка.
  • Вопрос задан
  • 77 просмотров
Пригласить эксперта
Ответы на вопрос 2
Melkij
@Melkij
PostgreSQL DBA
mysql... Опять же нет никаких средств сгенерировать табличное представление из внешних данных, кроме:
Сделать временную таблицу
create temporary table external_geo_ids (ext_id int(11) not null);
insert into external_geo_ids values (1),(2),(-1);
select /**/ 
from external_geo_ids 
left join geo_regions_yandex on GeoRegionId=ext_id;

Более многословно, но должно получиться быстрее на количестве проверяемых регионов больше нескольких штук.

Или на лету джойнить подзапрос с бесконечными union all
select /**/ 
from (
    select 1 as ext_id
    union all
    select 2
    union all
    select -1
) external_geo_ids 
left join geo_regions_yandex on GeoRegionId=ext_id;
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
А это обязательно так костыльно делать? Не проще получить массив идентификаторов и программно отделить что не выбралось? Не надо пользоваться молотком где можно пинцетом. В смысле получается задача ради задачи, а не ради правильного решения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы