我有两张桌子
一个td_job
具有这些结构
|---------|-----------|---------------|----------------|
| job_id | job_title | job_skill | job_desc |
|------------------------------------------------------|
| 1 | Job 1 | 1,2 | |
|------------------------------------------------------|
| 2 | Job 2 | 1,3 | |
|------------------------------------------------------|
另一个表是td_skill
,这是
|---------|-----------|--------------|
|skill_id |skill_title| skill_slug |
|---------------------|--------------|
| 1 | PHP | 1-PHP |
|---------------------|--------------|
| 2 | JQuery | 2-JQuery |
|---------------------|--------------|
现在td_job中的job_skill实际上是来自td_skill的skill_id列表
这意味着job_id 1有两个与之相关的技能,skill_id 1和skill_id 2
现在我正在编写一个这样的查询
SELECT * FROM td_job,td_skill
WHERE td_skill.skill_id IN (SELECT td_job.job_skill FROM td_job)
AND td_skill.skill_slug LIKE '%$job_param%'
现在,当$ job_param是PHP时,它会返回一行,但是如果$ job_param是JQuery,则返回空行。
我想知道错误在哪里。
答案 0 :(得分:1)
错误是您将id列表存储在列中而不是存储在关联/联结表中。您应该有另一个表JobSkills
,每个作业/技能组合一行。
第二个和第三个问题是,您似乎不了解联接的工作方式以及in
如何使用子查询。在任何情况下,您似乎想要的查询更像是:
SELECT *
FROM td_job j join
td_skill s
on find_in_set(s.skill_id, j.job_skill) > 0 and
s.skill_slug LIKE '%$job_param%';
非常糟糕的数据库设计。如果可以,你应该解决这个问题。