使用LEFT JOIN和LIKE mysql

saa*_*ulu 4 mysql

我在mysql查询中有问题.这是我的表格的样子:

mysql> select username, specialty from users;
+----------+------------------+
| username | specialty        |
+----------+------------------+
| JinkX    | php, html, mysql |
| test1    | html             |
+----------+------------------+


mysql> select name, tags from tasks;
+----------------+------+
| name           | tags |
+----------------+------+
| fix front page | html |
+----------------+------+
Run Code Online (Sandbox Code Playgroud)

当我尝试执行以下查询时,只有当专业完全等于标签时,它才有效.但我希望它能同时发挥作用

mysql> select tasks.name from users left join tasks on tasks.tags LIKE users.specialty where users.username = 'test1';
+----------------+
| name           |
+----------------+
| fix front page |
+----------------+

mysql> select tasks.name from users left join tasks on tasks.tags LIKE users.specialty where users.username = 'JinkX';
+------+
| name |
+------+
| NULL |
+------+
Run Code Online (Sandbox Code Playgroud)

Kee*_*per 9

like做错了.

试试这个查询:

select tasks.name 
from users left join tasks on users.specialty LIKE CONCAT('%',tasks.tags,'%') 
where users.username = 'JinkX'
Run Code Online (Sandbox Code Playgroud)

这不是最好的方法,但应该有效

编辑:根据评论,还有另一种应该更好的方式

使用REGEXP:

select tasks.name 
from users left join tasks on users.specialty REGEXP CONCAT('(^|,) ?',tasks.tags,' ?($|,)') 
where users.username = 'JinkX'
Run Code Online (Sandbox Code Playgroud)


Joe*_*lli 6

好吧,你已经发现了将独立值保存为逗号分隔字符串的痛苦.

如果可以,我建议您更改数据结构,从用户表中获取专业列,并创建一个user_specialty具有外键users.username和的新表tasks.tags.

+----------+------------------+
| username | tag              |
+----------+------------------+
| JinkX    | php              |
| JinkX    | html             |
| JinkX    | mysql            |
| test1    | html             |
+----------+------------------+
Run Code Online (Sandbox Code Playgroud)