加入关于模式匹配的表格

时间:2014-04-11 10:26:41

标签: mysql regex join

我一直在努力奋斗几个小时,所以非常欢迎任何反馈或建议。

我有三张桌子:

users
id    name    email
1     test    test@test.com
2     test2   test2@test.com

pets
pet_id    pet_name    user_id
1         sam         2
2         sally       1

transactions
trans_id    custom
1           1
2           pid2
3           pid1

好的,我想做的是获取与用户相关的交易数据。因此,在“交易”表中,“自定义”值1将与具有ID的“用户”相关。多数民众赞成......

带有'pid'的'Transactions'与pet id有关,所以'pid2'与sally有关,其用户是用户id 1.所以我需要在自定义与用户ID相关或者前缀时加入事务表'pid'和附加值与'pet_id'有关。

以下是我想要的结果示例:

与user_id 1相关的交易:

trans_id 1, custom 1
trans_id 2 custom pid2 (this is because the pets owner is user_id 1)

这就是我现在尝试的地方:

SELECT users.*, transactions.* 
FROM users 
LEFT JOIN transactions on users.id = transactions.custom

这是我摔倒的地方:

SELECT users.*, transactions.* 
FROM users 
LEFT JOIN pets ON pets.user_id = user.id 
LEFT JOIN transactions on (users.id = transactions.custom 
OR pets.pet_id REGEXP '^pid(transactions.custom)')

2 个答案:

答案 0 :(得分:0)

如果您无法更改表格设计并修复了前缀pid,则可以使用

OR (
    pets.pet_id = SUBSTR(transactions.custom, 3) 
    AND SUBSTR(transactions.custom, 1 FOR 3) = 'pid')

请参阅SUBSTR的文档,因为MySQL会根据需要自动将数字转换为字符串,反之亦然,请参阅:http://dev.mysql.com/doc/refman/5.7/en/type-conversion.html

答案 1 :(得分:0)

来重构您的数据库。目前的结构将保证速度问题。

表格交易应该是

CREATE TABLE transactions
(
  id Int NOT NULL, (id of transaction)
  pet_id Int, (can be null)
  user_id Int (can be null)
  other columns here... 
)
;