3

我有一个乐器清单和教师乐器清单。

我想获得带有 id 和 name 的完整仪器列表。

然后检查 Teachers_instrument 表中的乐器,以及特定教师是否在新列中添加了乐器NULL或值。1

然后我可以用它来循环 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
4

2 回答 2

2

一种可能的方法:

    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 JOINoninstrument_id我们将为teacher_id每种乐器获得与使用它的教师一样多的值 - 或者只有一个NULL值,如果没有人使用它。下一步是使用GROUP BY并按COUNT()仪器对结果集进行分组并计算其用户(不包括 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;

演示

于 2013-02-11T17:32:44.560 回答
1

那么这可以像这样实现

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。

于 2013-02-11T18:04:01.860 回答