特殊查询中的MySQL子句

特殊查询中的MySQL子句,mysql,sql,Mysql,Sql,我有一件奇怪的事情要做,这可能意味着一个奇怪的问题。基本上到目前为止,我所拥有的是: SELECT * FROM locations WHERE name IN ('city1','city2','country1','city3'); 这很好,但我想修改这个查询。假设我想以某种方式将city1与country1分组,这样如果其中一个返回一行(是查询的有效选择器),那么另一个就不应该再执行了。比如: SELECT * FROM locations WHERE name IN (('city1'

我有一件奇怪的事情要做,这可能意味着一个奇怪的问题。基本上到目前为止,我所拥有的是:

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
的值,因此不是我想要的

这样的事情可能吗

编辑: 更具体地说,这里有一个例子

我有3个位置(在PHP中),我将分为5个:

罗马尼亚布加勒斯特
纽约
西班牙巴塞罗那

这些将成为3组阵列:

array( 'Bucharest', 'Romania' )
array( 'New York' )
array( 'Barcelona', 'Spain' )
我想查找每个位置的大陆。我将使用MySQL中的子句中的
在同一个查询中搜索它们。我希望查询返回3行:
欧洲
北美
欧洲

但是,我的查询找不到
布加勒斯特
的条目,因为它不在表中,所以我想在数组中搜索下一个词:
罗马尼亚


希望这能澄清问题。

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

SELECT * FROM locations WHERE name IN ('city2','city3')
UNION
(SELECT * FROM locations WHERE name IN ('city1','country1') LIMIT 1)
这将选择所有“非分组”名称,然后从第二次选择中仅选择第一行(如果匹配,则为“city1”;如果不匹配,则为“country1”;否则为“nothing”)


但是,如果您想让它更通用,就必须以其他方式完成:)

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

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

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

您应该用php生成内部查询…

这对我来说似乎没有意义。结果是一个布尔值,两者的区别是什么?如果您包含一些示例数据,可能会有所帮助。不完全确定您想做什么。
'1'、'2'、'3'、'4'
,比如
,其中名称像'1'或名称像'2'或名称像'3'或名称像'4'
。你想精确地实现什么?你的意思是你只想匹配城市1或国家1,而不是两者都匹配吗?我用一个例子更新了我的问题,希望它能澄清问题。这是因为在第二个选择上需要括号,直到
限制1
之后。否则这正是我想要的。只是我希望有一个比2个选择更好的解决方案(因为我有大约2000个要搜索的值)。如果没有更好的答案出现,我会把这个标记为正确答案。非常感谢!我确实有这种结构(我不认为它很重要)。但是我还想给你的查询添加一个条件,这会把整个结果搞砸。
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