MYSQL查询从两个表中获取DATA,使用IN方法一作为多个数据的组合

时间:2014-04-26 11:46:59

标签: mysql

我有两张桌子

一个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,则返回空行。

我想知道错误在哪里。

1 个答案:

答案 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%';

非常糟糕的数据库设计。如果可以,你应该解决这个问题。