MySQL加入并创建新的列值

时间:2013-02-11 17:14:02

标签: php mysql codeigniter

我有一份仪器清单和教师工具清单。

我想获得一个包含id和名称的完整乐器列表。

然后检查teachers_instrument表格中的仪器,以及特定教师是否让仪器在新列中添加NULL1值。

然后我可以把它循环到Codeigniter中的一些乐器复选框,它似乎更有意义从数据库中提取数据,但我很难写出查询。

teaching_instrument_list

- id
- instrument_name

 teachers_instruments

- id
- teacher_id
- teacher_instrument_id

 SELECT
  a.instrument,
  a.id
 FROM
   teaching_instrument_list a
 LEFT JOIN
 (
    SELECT teachers_instruments.teacher_instrument_id
    FROM teachers_instruments
    WHERE teacher_id = 170
 ) b ON a.id = b.teacher_instrument_id  

我的查询看起来像这样:

 instrument name    id   value
 ---------------    --   -----
 woodwinds          1    if the teacher has this instrument, set 1
 brass              2     0
 strings            3     1

2 个答案:

答案 0 :(得分:0)

一种可能的方法:

    SELECT i.instrument_name, COUNT(ti.teacher_id) AS used_by 
      FROM teaching_instrument_list AS i
 LEFT JOIN teachers_instruments AS ti
        ON ti.teacher_instrument_id = i.id
  GROUP BY ti.teacher_instrument_id
  ORDER BY i.id;

这里是SQL Fiddle(表的命名有点不同)。

说明:LEFT JOIN上的instrument_id我们会为使用它的教师获得尽可能多的teacher_id值,或者只有一个NULL值,如果没有人使用它。下一步是使用GROUP BYCOUNT()来对仪器的结果进行分组并计算其用户数(不包括NULL值行)。

如果你想要的是显示所有乐器和一些标志显示教师是否或现在使用它,你需要另一个LEFT JOIN:

    SELECT i.instrument_name, NOT ISNULL(teacher_id) AS in_use
      FROM teaching_instrument_list AS i
 LEFT JOIN teachers_instruments AS ti
        ON ti.teacher_instrument_id = i.id
       AND ti.teacher_id = :teacher_id;

Demo

答案 1 :(得分:0)

这可以像这样实现

SELECT
  id,
  instrument_name,
  if(ti.teacher_instrument_id IS NULL,0,1) as `Value`
from teaching_instrument_list as til
  LEFT JOIN teachers_instruments as ti
    on ti.teacher_instrument_id = til.id

添加一列并检查teacher_instrument_id。如果找到将Value设置为1,则为其他0。