我有一个奇怪的事情要做,这可能意味着一个奇怪的查询。基本上我到现在所拥有的是:
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:
Bucharest, Romania
New York
Barcelona, Spain
这些将成为3组数组:
array( 'Bucharest', 'Romania' )
array( 'New York' )
array( 'Barcelona', 'Spain' )
我想查找每个位置的大陆。我将使用MySQL的IN
子句在同一查询中搜索所有这些。我希望查询返回3行:Europe
,North America
,Europe
。
但是,我的查询找不到Bucharest
的条目,因为它不在表格中,所以我想搜索数组中的下一个词:Romania
。
希望这可以解决问题。
答案 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中生成内部查询...