mysql WHERE 之后的 CONCAT?

mysql CONCAT after WHERE?

我有一个管理出勤的查询。我想添加一个功能来显示谁已经支付了当月的费用,谁没有。差不多可以了。

SELECT
    students.sid,
    students.name,
    students.day,
    students.times,
    students.days,
    CONCAT(payments.year,'-', payments.forMonth) AS pdate
FROM students
LEFT JOIN payments
    ON students.sid = payments.sid
WHERE
    students.Active = 'Yes' AND
    students.day LIKE 'Tue%' AND
    payments.date = (SELECT date FROM payments WHERE students.sid = payments.sid AND
                     payments.payfor = 'tuition' ORDER BY payments.pid DESC LIMIT 1 )

主要的麻烦部分是 (SELECT date FROM) 子查询。 CONCAT 在 payments.payfor 限制器之前获取它从 payments table 获得的第一个值=]付款子查询 集。因此,在下面的 table 片段中,我得到了 sk1 条目,而不是 Dec 的正确 tuition

pid     sid  amt    payfor  forMonth    year    date
1076    69  7000    tuition Dec         2017    2017-12-17
1074    69  4000     sk1    Sep         2017    2017-12-17
1046    69  7000    tuition Nov         2017    2017-11-23

有没有办法在 CONCAT(payments.year,'-', payments.forMonth)?

您应该在相关的 on 子句中移动与左连接表相关的条件,否则如果在 where 条件中用作内部连接并且不 return 他相关行

  SELECT students.sid, students.name, students.day, students.times, students.days, 
  CONCAT(payments.year,'-', payments.forMonth) AS pdate 
  FROM students 
  LEFT JOIN payments ON students.sid = payments.sid  
        AND payments.date = (SELECT date 
          FROM payments 
          WHERE students.sid = payments.sid 
          AND payments.payfor = 'tuition' 
          ORDER BY payments.pid DESC LIMIT 1 
        )
  WHERE students.Active = 'Yes' 
  AND students.day LIKE 'Tue%'

如果您只想要学费,您也应该过滤这个值

  SELECT students.sid, students.name, students.day, students.times, students.days, 
  CONCAT(payments.year,'-', payments.forMonth) AS pdate 
  FROM students 
  LEFT JOIN payments ON students.sid = payments.sid  
        AND payments.date = (SELECT date 
          FROM payments 
          WHERE students.sid = payments.sid 
          AND payments.payfor = 'tuition' 
          ORDER BY payments.pid DESC LIMIT 1 
        ) 
        AND payments.payfor='tuition'

  WHERE students.Active = 'Yes' 
  AND students.day LIKE 'Tue%'

好的,我知道了。我加了

AND payments.payfor = 'tuition'

之后
students.Active = 'Yes' AND
students.day LIKE 'Tue%'

在我的原始查询中。然后,一切都按需工作。