MySQL IN子句特殊查询

时间:2012-01-06 13:22:44

标签: mysql sql

我有一个奇怪的事情要做,这可能意味着一个奇怪的查询。基本上我到现在所拥有的是:

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

这很好用,但我想改变这个查询。假设我想以某种方式将city1country1分组,因此,如果其中一个返回一行(是查询的有效选择器),则另一个不应再执行。类似的东西:

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

此查询有效,但只返回包含city2city3的值,因此不是我想要的。

这样的事情会成为可能吗?

编辑: 更具体地说,这是一个例子。

我有3个位置,(在PHP中),我将打破5:

Bucharest, Romania New York Barcelona, Spain

这些将成为3组数组:

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

我想查找每个位置的大陆。我将使用MySQL的IN子句在同一查询中搜索所有这些。我希望查询返回3行:EuropeNorth AmericaEurope

但是,我的查询找不到Bucharest的条目,因为它不在表格中,所以我想搜索数组中的下一个词:Romania

希望这可以解决问题。

3 个答案:

答案 0 :(得分:2)

我不认为这是最好的解决方案,但我认为你可以这样做:

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

将选择所有“非分组”名称,然后仅从第二个选择中选择第一行(如果匹配则为“city1”,如果不匹配则为“country1”,或者没有)

但如果你想要它更通用,我必须以其他方式完成它。)

答案 1 :(得分:0)

您的问题是您的表太通用了 - 您有两个不同的实体(城市和国家/地区)存储在一个表中。

我真的建议你将数据库结构改为

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

答案 2 :(得分:0)

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中生成内部查询...