简体   繁体   English

未知列where子句

[英]Unknown column where clause

I have following DQL query 我有以下DQL查询

SELECT
    ps.id,
    MAX(ps.dueDate) as due_date,
    u.firstName as first_name,
    u.lastName as last_name,
    u.email,
    IDENTITY(ps.loanApplication) as loan_application_id,
    DATE_DIFF(MAX(ps.dueDate), CURRENT_DATE()) as diff
FROM
    Loan\Entity\PaymentSchedule ps
LEFT JOIN
    ps.paymentType pt
LEFT JOIN
    ps.loanApplication la
LEFT JOIN
    la.status s
LEFT JOIN
    la.user u
WHERE
    pt.slug != :paymentSlug AND s.keyIdentifier = :status AND diff = 14
GROUP BY
    ps.loanApplication

Which translates to following SQL query 转换为以下SQL查询

SELECT
    p0_.id AS id_0,
    MAX(p0_.due_date) AS sclr_1,
    u1_.first_name AS first_name_2,
    u1_.last_name AS last_name_3,
    u1_.email AS email_4,
    p0_.loan_application_id AS sclr_5,
    DATEDIFF(MAX(p0_.due_date), CURRENT_DATE) AS sclr_6 
FROM
    payment_schedule p0_
LEFT JOIN
    payment_type p2_ ON p0_.payment_type_id = p2_.id
LEFT JOIN
    loan_application l3_ ON p0_.loan_application_id = l3_.id
LEFT JOIN 
    loan_application_status l4_ ON l3_.loan_application_status_id = l4_.id
LEFT JOIN
    user u1_ ON l3_.user_id = u1_.id
WHERE
    p2_.slug <> ? AND l4_.key_identifier = ? AND sclr_6 = 14
GROUP BY
    p0_.loan_application_id

This gives me following error 这给我以下错误

======================================================================
 PDOException
 SQLSTATE[42S22]: Column not found: 1054 Unknown column 'sclr_6' in 'where clause'
----------------------------------------------------------------------

When i replace WHERE condition 当我更换WHERE条件时

WHERE pt.slug != :paymentSlug AND s.keyIdentifier = :status AND diff = 14

With

WHERE pt.slug != :paymentSlug AND s.keyIdentifier = :status

It works perfectly and displays me correct record, i also tried following WHERE condition 它可以完美运行并向我显示正确的记录,我也尝试了以下条件

WHERE pt.slug != :paymentSlug AND s.keyIdentifier = :status AND DATE_DIFF(MAX(ps.dueDate), CURRENT_DATE()) = :days_diff

WHERE pt.slug != :paymentSlug AND s.keyIdentifier = :status HAVING (DATE_DIFF(MAX(ps.dueDate), CURRENT_DATE())) = :days_diff

Above WHERE does not work as well, what am i missing here ? 上面的WHERE也不起作用,我在这里想念什么?

Thanks. 谢谢。

If you want to use the alias in your WHERE clause you need a sub-select . 如果要在WHERE子句中使用别名,则需要一个sub-select

select *
from 
(SELECT
    p0_.id AS id_0,
    MAX(p0_.due_date) AS sclr_1,
    u1_.first_name AS first_name_2,
    u1_.last_name AS last_name_3,
    u1_.email AS email_4,
    p0_.loan_application_id AS sclr_5,
    DATEDIFF(MAX(p0_.due_date), CURRENT_DATE) AS sclr_6 
FROM
    payment_schedule p0_
LEFT JOIN
    payment_type p2_ ON p0_.payment_type_id = p2_.id
LEFT JOIN
    loan_application l3_ ON p0_.loan_application_id = l3_.id
LEFT JOIN 
    loan_application_status l4_ ON l3_.loan_application_status_id = l4_.id
LEFT JOIN
    user u1_ ON l3_.user_id = u1_.id
) A
WHERE
    slug <> ? AND key_identifier = ? AND sclr_6 = 14

This is how query is logically processed 这是逻辑上处理查询的方式

FROM clause
WHERE clause
SELECT clause
GROUP BY clause
HAVING clause
ORDER BY clause

Since Where comes before Select you cannot use alias name in Where clause 由于Where Select之前先出现”,因此您不能在“ Where子句中使用alias name

You cannot use an alias (on the final result fields) in the WHERE clause; 您不能在WHERE子句中使用别名(在最终结果字段中)。 however, at least with MySQL, you may use a HAVING clause without needing a GROUP BY . 但是,至少在MySQL中,您可以使用HAVING子句而不需要GROUP BY

The expression you are using is the result of an aggregation. 您使用的表达式是聚合的结果。 Replace add a having clause so the query looks like; 替换添加一个having子句,使查询看起来像;

SELECT . . .
WHERE p2_.slug <> ? AND l4_.key_identifier = ? 
GROUP BY p0_.loan_application_id
HAVING sclr_6 = 14

Note that date_diff() is not a function in MySQL. 注意date_diff()在MySQL中不是一个函数。 You intend datediff() . 您打算使用datediff()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM