Специальный запрос предложения MySQL IN - PullRequest
1 голос
/ 06 января 2012

У меня есть странная вещь, и это, вероятно, подразумевает странный запрос. В основном то, что у меня есть до сих пор:

SELECT * FROM locations WHERE name IN ('city1','city2','country1','city3');

Это отлично работает, но я хочу изменить этот запрос. Скажем, я хочу как-то сгруппировать city1 с country1, поэтому, если один из них возвращает строку (является допустимым селектором для запроса), то другой не должен больше выполняться. Что-то вроде:

SELECT * FROM locations WHERE name IN (('city1' OR 'country1'),'city2','city3');

Этот запрос работает, но возвращает только те значения, которые содержат city2 и city3, поэтому не то, что я хочу.

Возможно ли что-то подобное?

EDIT: Чтобы быть более конкретным, вот пример.

У меня есть 3 локации, которые (в PHP) я собираюсь разбить на 5:

Bucharest, Romania New York Barcelona, Spain

они станут 3 наборами массивов:

array( 'Bucharest', 'Romania' )
array( 'New York' )
array( 'Barcelona', 'Spain' )

Я хочу посмотреть континент каждой из этих локаций. Я буду искать их все в одном запросе, используя предложение IN из MySQL. Я хочу, чтобы запрос возвращал 3 строки: Europe, North America, Europe.

Однако мой запрос не может найти запись для Bucharest, потому что ее нет в таблице, поэтому я хотел бы найти следующий термин в массиве: Romania.

Надеюсь, это прояснит ситуацию.

Ответы [ 3 ]

2 голосов
/ 06 января 2012

Я не думаю, что это лучшее решение, но я думаю, что вы можете достичь его следующим образом:

SELECT * FROM locations WHERE name IN ('city2','city3')
UNION
(SELECT * FROM locations WHERE name IN ('city1','country1') LIMIT 1)

, который выберет все «не сгруппированные» имена, а затем выберет только первую строку извторой выберите (это будет "city1", если он соответствует, или "country1", если это не так, или ничего)

Но если вы хотите, чтобы это было более общим, это должно быть сделано как-то иначе, я думаю:)

0 голосов
/ 06 января 2012
SELECT inputdata.city, inputdata.country, l.continent_id from
  (
  select 'city1' city, 'country1' country from dual
  union all
  select 'city2' city, null country from dual
  union all 
  select 'city2' city, null country from dual
  ) inputdata
join locations l
on l.name = inputdata.city or l.name = inputdata.country
group by inputdata.city, inputdata.country

вы должны сгенерировать внутренний запрос в php ...

0 голосов
/ 06 января 2012

Ваша проблема в том, что ваша таблица слишком общая - у вас есть две разные сущности (города и страны), хранящиеся в одной таблице.

Я бы действительно посоветовал вам изменить структуру вашей базы данных на

CREATE TABLE countries ( id, name );
CREATE TABLE cities ( id, name, country_id );

Тогда, если вы хотите выбрать города и их страны, используйте левое соединение

SELECT cities.name, countries.name
FROM cities LEFT JOIN countries ON countries.id = cities.country_id

Если ваши данные выглядят так:

-- countries
id, name
1, Romania
2, Spain

-- cities
id, country_id, name
1,  1,        , Bucharest
2,  2,        , Barcelona
3,  NULL,     , New York

верхний запрос вернет именно то, что вы хотите

Bucharest, Romania
Barcelona, Spain
New York,  NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...