【问题标题】:mysql CONCAT after WHERE?mysql CONCAT 在 WHERE 之后?
【发布时间】:2025-12-05 19:40:02
【问题描述】:

我有一个管理考勤的查询。我想添加一个功能,显示谁支付了当月的费用,谁没有支付。它几乎可以工作。

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 子查询 集合中的 payments.payfor 限制器之前从 payments 表中获取第一个值。因此,在下面的表 sn-p 中,我得到了 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,'-', payment.forMonth) 之前或同时获取 payments.date 子查询?

【问题讨论】:

    标签: mysql subquery concat


    【解决方案1】:

    好的,我明白了。我加了

    AND payments.payfor = 'tuition'
    

    之后

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

    在我原来的查询中。然后,一切都按需要进行。

    【讨论】:

      【解决方案2】:

      您应该在相关的 on 子句中移动与左连接表相关的条件,否则如果在 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  
              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%'
      

      【讨论】:

      • 谢谢,但它仍在获取所有的“payments.payfor”,而不仅仅是“学费”
      • 我猜我们是同时找到的。