Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在联接时更改一个表中的行值以匹配另一个表中的行值_Mysql - Fatal编程技术网

Mysql 在联接时更改一个表中的行值以匹配另一个表中的行值

Mysql 在联接时更改一个表中的行值以匹配另一个表中的行值,mysql,Mysql,我使用的是一个没有有效规范化的数据库,所以我必须在连接表方面发挥创造性。我有一个表的列名为'direction_or',全名为'Northwest','Southwest',另一个表的列名相同,但缩写为'NW','SW',我需要根据这些参数连接这些表。不幸的是,在关键点上加入是不可能的 我想知道是否可以使用CASE-WHEN或其他方法来计算全名,然后使其成为缩写名,然后在一个查询中基于该缩写名加入表 就像我说的,我必须要有创造力,这让我很难堪 诸如此类的事,请原谅我的无知 选择*FROM use

我使用的是一个没有有效规范化的数据库,所以我必须在连接表方面发挥创造性。我有一个表的列名为'direction_or',全名为'Northwest','Southwest',另一个表的列名相同,但缩写为'NW','SW',我需要根据这些参数连接这些表。不幸的是,在关键点上加入是不可能的

我想知道是否可以使用CASE-WHEN或其他方法来计算全名,然后使其成为缩写名,然后在一个查询中基于该缩写名加入表

就像我说的,我必须要有创造力,这让我很难堪

诸如此类的事,请原谅我的无知

选择*FROM user.directions AS A以某种方式更改A.direction_或AS newAbb LEFT JOIN storage的值。directions AS B ON A.newAbb=B.direction_或


先谢谢你

如果您想要一种既简单又沉重的方式,您可以:

创建一个表对术语。它应该是非常轻量级的,并且很可能在每次使用它时都会被缓存,但自从IMBRIGUED select以来,它仍然有一个权重

然后你会做: 选择*FROM user.directions作为左连接storage.directions作为B ON选择desiredvalue FROM states和abrevision,其中state=A.newAbb=B.direction\u或

或者类似的事情

解决这个问题的另一种方法是使用枚举。通过创建两个枚举并将相应的字符串映射到等价的整数,您可能很容易对它们进行比较。您需要更改表以更改varchar->相应枚举的类型

见:


编辑:在比较枚举时,您可能需要做一些尴尬的事情,例如A.enumvar+0=B.enumvar+0。尽管如此,您仍然可以尝试不使用它,因为如果代码可以工作,那么代码将更容易阅读

您可以创建一个查找表,将全名映射到缩写名,然后在查询中与该表联接

否则,您也可以这样做:

SELECT * FROM
(
    SELECT *,
        CASE
            WHEN direction_or = 'Northwest' THEN 'NW'
            WHEN direction_or = 'Southwest' THEN 'SW'
            -- all other possibilities here
            ELSE ''
        END as direction_or_abb

    FROM user.directions
) a

JOIN stored.directions b
    ON a.direction_or_abb = b.direction_or

你有权更改数据库吗?例如,创建表?是的,我能够创建表。然后我认为最好的方法是使用枚举,请参阅答案。感谢您的回答,我将使用这些。好主意。如果它最终有效,请毫不犹豫地选择对您有效的答案,这将有助于回答者,并防止问题引发堆栈溢出。使用表格法作为快速修复方法,效果完美。谢谢!感谢您的回复,Alceste!uz的表格想法,这是您的第一个建议,效果很好。我也会搞乱你的查询方法,我在示例中的两个表之上加入了另外7个表。