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%'
在我的原始查询中。然后,一切都按需工作。
我有一个管理出勤的查询。我想添加一个功能来显示谁已经支付了当月的费用,谁没有。差不多可以了。
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%'
在我的原始查询中。然后,一切都按需工作。