【问题标题】:getting fieldname from multiple tables depending on condition根据条件从多个表中获取字段名
【发布时间】:2013-09-25 06:32:21
【问题描述】:

我有以下 mysql 查询:

SELECT 
  u.ID,
  u.StudentCode,
  c.classname,
  s.STUDENTNAME,
  u.UserCode,
  g.ForeName AS MessageSentBy,
  u.Message,
  u.ForTchrSname AS MessageSentTo,
  DATE_FORMAT(u.datetime, '%d-%m-%y') AS datesent,
  u.RecordStatus 
FROM
  tblupdates u,
  tblguardian g,
  tblstudent s,
  tblclass c 
WHERE u.UserCode = g.GuardianCode 
  AND u.StudentCode = s.STUDENTCODE 
  AND (
    YEAR(u.DateTime) = '2013' 
    AND MONTH(u.DateTime) = '09'
  ) 
  AND u.RecordStatus = 'N' 
  AND c.classcode = s.classcode 
ORDER BY u.datetime DESC 

此查询的结果如下所示:

现在在 2013 年和 09 月的 tblupdates 中,我有以下行:

现在在上面的结果中,我正在获取id=138 的数据,但我想显示所有数据。不显示其他行的原因是(usercode-30000,admin) 这些发生在tblteacher 而不是tblguardian。所以现在我希望如果usercode 来自tblguardian 它显示监护人姓名,但如果它来自tblteacher 它显示teachername 但显示所有行。Tblteacher 和 tblupdates 可以分别由教师代码和用户代码加入。

我尝试了以下查询,但它没有返回任何行:

SELECT 
  u.ID,
  u.StudentCode,
  c.classname,
  s.STUDENTNAME,
  u.UserCode,
  IF(
    u.usercode NOT IN (g.guardiancode),
    t.teachername,
    g.ForeName
  ) AS MessageSentBy,
  u.Message,
  u.ForTchrSname AS MessageSentTo,
  DATE_FORMAT(u.datetime, '%d-%m-%y') AS datesent,
  u.RecordStatus 
FROM
  tblupdates u,
  tblguardian g,
  tblstudent s,
  tblclass c,
  tblteacher t 
WHERE u.UserCode = g.GuardianCode 
  AND u.StudentCode = s.STUDENTCODE 
  AND t.teachercode = u.usercode 
  AND (
    YEAR(u.DateTime) = '2013' 
    AND MONTH(u.DateTime) = '09'
  ) 
  AND u.RecordStatus = 'N' 
  AND c.classcode = s.classcode 
ORDER BY u.datetime DESC 

请帮帮我

【问题讨论】:

  • 外连接应该可以解决问题,在 mysql 中,左连接

标签: mysql asp.net sql database join


【解决方案1】:

使用CASE 尝试此操作,我已使用LEFT 加入您的表格,因此可能会有重复我使用GROUP BY 也使用u.id 但对正确的列名有点困惑请把正确的列放入分组

SELECT 
  u.ID,
  u.StudentCode,
  c.classname,
  s.STUDENTNAME,
  u.UserCode,  
  (CASE 
  WHEN u.usercode = t.teachercode THEN t.teachername 
  WHEN u.usercode = g.guardiancode THEN g.ForeName 
  ELSE END ) AS MessageSentBy,
  u.Message,
  u.ForTchrSname AS MessageSentTo,
  DATE_FORMAT(u.datetime, '%d-%m-%y') AS datesent,
  u.RecordStatus 
FROM
  tblupdates u
  LEFT JOIN  tblguardian g ON (u.UserCode = g.GuardianCode )
  LEFT JOIN  tblstudent s ON (u.StudentCode = s.STUDENTCODE )
  LEFT JOIN  tblclass c ON (c.classcode = s.classcode )
  LEFT JOIN   tblteacher t  ON (t.teachercode = u.usercode)
WHERE   u.RecordStatus = 'N' 
 AND  (
    YEAR(u.DateTime) = '2013' 
    AND MONTH(u.DateTime) = '09'
  )  
GROUP BY u.id
ORDER BY u.datetime DESC 

【讨论】:

  • thanx...它对我有用。但是我们可以通过一些小查询或其他方式来实现同样的效果吗。
  • Joins 是我们最好的朋友,我认为我们不能缩短这个查询,它只有两个条件,只有 joins
  • 如果我们想进行离线过滤,它会比这快还是需要同样的时间
  • 在上面的查询中,如果我使用 distinct(u.studentcode) 它显示错误..你能告诉我为什么
  • 如果 select 中有多个列,那么您不能将 DISTINCT 用于单列,并且 distinct 应该放在第一列之前,没有大括号,这就是我添加组的原因
猜你喜欢
  • 2020-09-24
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 2020-07-28
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多