特殊查询中的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