Mysql 在联接时更改一个表中的行值以匹配另一个表中的行值
我使用的是一个没有有效规范化的数据库,所以我必须在连接表方面发挥创造性。我有一个表的列名为'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_或Mysql 在联接时更改一个表中的行值以匹配另一个表中的行值,mysql,Mysql,我使用的是一个没有有效规范化的数据库,所以我必须在连接表方面发挥创造性。我有一个表的列名为'direction_or',全名为'Northwest','Southwest',另一个表的列名相同,但缩写为'NW','SW',我需要根据这些参数连接这些表。不幸的是,在关键点上加入是不可能的 我想知道是否可以使用CASE-WHEN或其他方法来计算全名,然后使其成为缩写名,然后在一个查询中基于该缩写名加入表 就像我说的,我必须要有创造力,这让我很难堪 诸如此类的事,请原谅我的无知 选择*FROM use
先谢谢你 如果您想要一种既简单又沉重的方式,您可以: 创建一个表对术语。它应该是非常轻量级的,并且很可能在每次使用它时都会被缓存,但自从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个表。