【问题标题】:mysql join for specific rows onlymysql join 只针对特定的行
【发布时间】:2017-01-01 00:31:32
【问题描述】:

我有三张桌子

cmets 表

---------------------------------------------------------------------------
id    |    commented_by       | comment          | commented_by
---------------------------------------------------------------------------
1     |    asdf156df5s4fd     | student comment  |  student
2     |    klsdfjklsdfno      | student comment  |  student
3     |    jafkadfjlkdnvwa    | teacher comment  |  teacher
4     |    adsjflandsfinndfs  | student comment  |  student
5     |    dsf5614dsf8wef4    | teacher comment  |  teacher
---------------------------------------------------------------------------

教师桌


id    |    teacher_id       | teacher_name | teaches
---------------------------------------------------------------------------
1     |    jafkadfjlkdnvwa  | abc cde      |  maths
2     |    dsf5614dsf8wef4  | egc kjl      |  science
.
.
.
---------------------------------------------------------------------------

学生桌


id    |    student_id        | student_name |
---------------------------------------------------------------------------
1     |    asdf156df5s4fd    | student_1    |
2     |    klsdfjklsdfno     | student_2    |
3     |    adsjflandsfinndfs | student_3    |
.
.
---------------------------------------------------------------------------

现在,我们希望 mysql join 可以返回类似这样的内容


id    |    comment_id         | comment_by |  name | teaches
---------------------------------------------------------------------------
1     |    asdf156df5s4fd     | student    |  student_1   | null
2     |    klsdfjklsdfno      | student    |  student_2   | null
3     |    jafkadfjlkdnvwa    | teacher    |  abc cde     | maths
4     |    adsjflandsfinndfs  | student    |  student_3   | null
5     |    dsf5614dsf8wef4    | teacher    |  egc kjl     | science
---------------------------------------------------------------------------

无法找到我们可以使用 codeigniter 活动记录实现此目的的确切查询

【问题讨论】:

  • 你能发布一些你尝试过的代码吗?顺便说一句,试试看这个链接:stackoverflow.com/questions/15219132/…
  • 您必须在此处提供有关您要执行的操作的更多信息。我个人不明白你是如何从这 3 个表中得到这些结果的。
  • @EatPeanutButter 基本上是一个我们要展示 cmets 的帖子,但随着老师的评论,它将包括他们教授但不针对学生的科目
  • 你需要规范化你的表格
  • @Oncodeeater 怎么做,建议我,没听说过

标签: php mysql codeigniter activerecord


【解决方案1】:

这是真正的脏表方案,但这是您想要的查询:

SELECT 
  c.id, 
  commented_by as comment_id, 
  commented_by, 
  IF(commented_by = 'student', student_name, teacher_name) as name, 
  teaches
FROM comments c
LEFT JOIN teacher t
  ON t.teacher_id = c.commented_by
 AND c.commented_by = 'teacher'
LEFT JOIN student s
  ON s.student_id = c.commented_by
 AND c.commented_by = 'student'

更好的表格方案:

CREATE TABLE comments (
  comment_id INT NOT NULL AUTO_INCREMENT,
  student_id INT,
  teacher_id INT,
  PRIMARY KEY (comment_id)
);

CREATE TABLE teachers (
  teacher_id INT NOT NULL AUTO_INCREMENT,
  teacher_name VARCHAR(200) NOT NULL,
  teacher_subject VARCHAR(50),
  PRIMARY KEY (teacher_id)
);

CREATE TABLE students (
  student_id INT NOT NULL AUTO_INCREMENT,
  student_name VARCHAR(200) NOT NULL,
  PRIMARY KEY (student_id)
);

SELECT 
  comments.*, 
  IF(student_id IS NOT NULL, student_name, teacher_name) as name, 
  teacher_subject
FROM comments
LEFT JOIN teachers USING(teacher_id)
LEFT JOIN students USING(student_id)

【讨论】:

  • 设计表模式的更好方法是什么?
【解决方案2】:

您需要加入学生和教师表:

select id, comment_id as comment_by , commented_by, 
( case when commented_by = 'teacher' THEN teacher_name else student_name ) AS name, teaches
from comments c left join teacher t ON t.teacher_id = c.commented_by left 
join student s ON s.student_id = c.commented_by 

【讨论】:

    猜你喜欢
    • 2014-11-28
    • 2012-08-06
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 2012-09-14
    相关资源
    最近更新 更多