我有两张桌子。第一个包含有关城市的信息:
位置:
locID | locationID | locationName | countryCode |
1 | 2922239 | Berlin | de |
2 | 291074 | Paris | fr |
3 | 295522 | Orlando | us |
3 | 292345 | Tokyo | jp |
还有第二个表,其中包含位置的替代名称。 “位置”表中的位置可能没有替代名称: AlternateNames:
altNameID | locationID | alternateName |
1 | 2922239 | Berlino |
2 | 2922239 | Berlina |
3 | 2922239 | capital |
4 | 291074 | Parisa |
5 | 291074 | Pariso |
6 | 295522 | Orlandola |
7 | 295522 | Orlandolo |
我想得到的是位置名称搜索的locationID,name和countryCode,例如“Berlin”或“Ber”:
| locationID | name | countryCode |
| 2922239 | Berlin | de |
但是,如果用户搜索“Berlino”,我想取回alternateName:
| locationID | name | countryCode |
| 2922239 | Berlino | de |
如果searchterm与两者匹配,则“locationName”的优先级高于alternateName。
我无法弄清楚如何构建查询来做到这一点。由于这个名字可能来自两个表中的一个,所以对我来说似乎很难。
非常感谢任何帮助!
答案 0 :(得分:3)
SELECT
locationID,
(IF (name LIKE 'Ber%', name, alternateName)) as name,
countryCode
FROM
Locations l LEFT JOIN AlternateNames a ON (l.locationID = a.locationID)
WHERE
name LIKE 'Ber%'
OR
alternateName LIKE 'Ber%'
显然,使用变量替换(:searchname)代替'Ber%'。
如果您只想返回1行,请将LIMIT 1
添加到查询的末尾。
根据对alternateName的首选项的评论进行编辑。按照Schultz999的建议制作LEFT加入
答案 1 :(得分:0)
这样的事情应该这样做。
select a.locationID, coalesce(b.alternateName,a.locationName), a.countrycode FROM table1 a LEFT JOIN table2 b ON a.locationId=B.locationID where a.locationName=?
答案 2 :(得分:0)
试试这个:
SELECT a.locationID,:locationName,a.countryCode //:locationName是城市名称参数
来自城市a,地点b
WHERE a.locationID = b.locationID
AND(a.locationName =:locationName OR b.alternateName =:locationName)
德尔>
SELECT a.locationID, a.locationName, a.countryCode
FROM cities a
WHERE a.locationName = :locationName
UNION ALL
SELECT a.locationID, b.alternateName locationName, a.countryCode
FROM cities a, locations b
WHERE a.locationID = b.locationID
AND b.alternateName = :locationName
答案 3 :(得分:0)
此查询通过联合查询连接两个表,对它们进行排名并从联合中获取最高结果。
试试这个:
SELECT
locationID
, `name`
, countryCode
FROM
(
SELECT
locationID
, `name`
, countryCode
, 1 AS priority
FROM
locations
WHERE
locationName LIKE 'Ber%'
UNION
SELECT
a.locationID
, a.alternateName AS `name`
, l.countryCode
, 2 as priority
FROM
AlternateNames a
INNER JOIN Locations l
ON a.locationID = l.locationID
WHERE
a.alternateName LIKE 'Ber%'
) u
ORDER BY
priority
LIMIT 1