mySQL - 用于组合两个表的查询

时间:2011-01-16 01:49:27

标签: sql mysql

我有两张桌子。第一个包含有关城市的信息:

位置:

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。

我无法弄清楚如何构建查询来做到这一点。由于这个名字可能来自两个表中的一个,所以对我来说似乎很难。

非常感谢任何帮助!

4 个答案:

答案 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