我有一份仪器清单和教师工具清单。
我想获得一个包含id和名称的完整乐器列表。
然后检查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
答案 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 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;
答案 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。