【问题标题】:Alias name causing error in the where clause - MySQL别名导致 where 子句中的错误 - MySQL
【发布时间】:2016-06-01 21:42:01
【问题描述】:

我的 SQL 代码:

SELECT (
           SELECT COUNT(1)
           FROM   FAVORI_DUALAR
           WHERE  DuaID       = D.DuaID
                  AND PID     = 'L3FNCPEVME36'
       )       AS Eklimi,
       (
           SELECT COUNT(1)
           FROM   EDILEN_DUALAR
           WHERE  DuaID       = D.DuaID
                  AND PID     = 'L3FNCPEVME36'
       )       AS Okudum,
       D.Tarih,
       D.DuaID,
       D.DuaBaslik,
       D.DuaTuru,
       D.DuaSayisiSiniri,
       D.DuaIcerik,
       D.DuaMeal,
       D.DuaArapca,
       D.PID,
       (
           SELECT COUNT(1)
           FROM   EDILEN_DUALAR
           WHERE  DuaID = D.DuaID
       )       AS Okundu
FROM   DUALAR     D
WHERE  D.Aktif = '1'
       AND (D.DuaTuru = 2 OR D.DuaTuru = 1 AND Okudum = 0)
ORDER BY
       D.Tarih DESC 
       LIMIT 9

错误:#1054 - 'where 子句'中的未知列 'Okudum'

我写了

SELECT COUNT(1)
FROM   EDILEN_DUALAR
WHERE  DuaID       = D.DuaID
       AND PID     = 'L3FNCPEVME36') AS Okudum

但我仍然在查询中收到错误。

【问题讨论】:

  • 用另一个选择包裹它,然后它就会识别这个列。
  • #1054 - 'where 子句'@pedram 中的未知列 'D.Okudum'
  • 使用having子句代替where(如果是别名)

标签: mysql sql where


【解决方案1】:

您的 Okudum 字段是查询中的计算字段。这不能直接引用(仅在 ORDER BY 中)。

所以你可以在where子句中使用:

WHERE ... AND (SELECT COUNT(1) FROM   EDILEN_DUALAR WHERE DuaID = D.DuaID AND PID = 'L3FNCPEVME36') = 0

或者你可以做一个子查询: 使用 EDILEN_DUALAR 作为子查询进行连接。

SELECT (
           SELECT COUNT(1)
           FROM   FAVORI_DUALAR
           WHERE  DuaID       = D.DuaID
                  AND PID     = 'L3FNCPEVME36'
       )       AS Eklimi,
       ED.Okudum,
       D.Tarih,
       D.DuaID,
       D.DuaBaslik,
       D.DuaTuru,
       D.DuaSayisiSiniri,
       D.DuaIcerik,
       D.DuaMeal,
       D.DuaArapca,
       D.PID,
       (
           SELECT COUNT(1)
           FROM   EDILEN_DUALAR
           WHERE  DuaID = D.DuaID
       )       AS Okundu
, D.Aktif
FROM   DUALAR D LEFT JOIN
    (SELECT DuaID, COUNT(1) AS Okudum
           FROM   EDILEN_DUALAR
           WHERE  PID     = 'L3FNCPEVME36'
                  GROUP BY DuaID       ) ED

ON ED.DuaID = D.DuaID
WHERE   D.Aktif = '1'
       AND (D.DuaTuru = 2 OR D.DuaTuru = 1 AND (ED.Okudum IS NULL OR ED.Okudum = 0))
ORDER BY
       D.Tarih DESC 

【讨论】:

  • 不起作用 #1054 - 'where 子句'中的未知列 'Q.Aktif'
  • 是的,我知道我可以使用 'WHERE ... AND (SELECT COUNT(1) FROM EDILEN_DUALAR WHERE DuaID = D.DuaID AND PID = 'L3FNCPEVME36') = 0' 这个代码,但我已经选择:)
  • 再次出错 :( #1064 - 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取在 'D.Aktif FROM DUALAR D 附近使用的正确语法)Q WHERE Q.Aktif = '1' AND (Q.DuaTuru =' 在第 28 行
  • 工作,21.9796。秒 :( 这么晚了,我们该怎么办?你的第一个代码在 7 秒内运行
  • 抱歉,这么晚才看到你的回复,错误:#1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 36 行的 '' 附近使用
【解决方案2】:

你需要使用having子句代替where。否则您需要提供完整的参考名称和表格,例如 我编辑我的答案,请参阅

SELECT ( SELECT COUNT(1) FROM FAVORI_DUALAR WHERE DuaID = D.DuaID AND PID = 'L3FNCPEVME36' ) AS Eklimi, ( SELECT COUNT(1) FROM EDILEN_DUALAR WHERE DuaID = D.DuaID AND PID = 'L3FNCPEVME36' ) AS Okudum, D.Tarih, D.DuaID, D.DuaBaslik, D.DuaTuru, D.DuaSayisiSiniri, D.DuaIcerik, D.DuaMeal, D.DuaArapca, D.PID, ( SELECT COUNT(1) FROM EDILEN_DUALAR WHERE DuaID = D.DuaID ) AS Okundu FROM DUALAR D having D.Aktif = '1' AND (D.DuaTuru = 2 OR D.DuaTuru = 1 AND Okudum = 0) ORDER BY D.Tarih DESC

【讨论】:

  • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 'have Okudum = 0) 附近使用的正确语法
  • 我写了 'WHERE D.Aktif = '1' AND (D.DuaTuru = 2 OR D.DuaTuru = 1 AND with Okudum = 0) ORDER BY D.Tarih DESC LIMIT 9'
  • 错误:#1054 - '有子句'中的未知列'D.Aktif'
【解决方案3】:

你可以试试这个。假设您在 DUALAR.AktifDUALAR.DuaTuru 中有 2 个索引,这应该比我的第一个答案运行得更快。

select 
    (
       SELECT COUNT(1)
       FROM   FAVORI_DUALAR
       WHERE  DuaID       = D.DuaID
              AND PID     = 'L3FNCPEVME36'
   )       AS Eklimi,
   D.Okudum,
   D.Tarih,
   D.DuaID,
   D.DuaBaslik,
   D.DuaTuru,
   D.DuaSayisiSiniri,
   D.DuaIcerik,
   D.DuaMeal,
   D.DuaArapca,
   D.PID,
   (
       SELECT COUNT(1)
       FROM   EDILEN_DUALAR
       WHERE  DuaID = D.DuaID
   )       AS Okundu
from
    (select 
        (
            SELECT COUNT(1)
            FROM   EDILEN_DUALAR
            WHERE  DuaID       = d1.DuaID
                  AND PID     = 'L3FNCPEVME36'
        )       AS Okudum
        ,d1.*
    FROM   
        DUALAR     d1
    WHERE  
        d1.Aktif = '1' 
        and d1.DuaTuru = 2
    union all
    select 
        (
            SELECT COUNT(1)
            FROM   EDILEN_DUALAR
            WHERE  DuaID       = d2.DuaID
                  AND PID     = 'L3FNCPEVME36'
        )       AS Okudum
        ,d2.*
    FROM   
        DUALAR     d2
    WHERE  
        d2.Aktif = '1' 
        and d2.DuaTuru = 1
    ) D
where
    (D.DuaTuru = 2 OR D.DuaTuru = 1 AND D.Okudum = 0)
ORDER BY
    D.Tarih DESC 
LIMIT 9;

【讨论】:

  • @KubilayKaanDurmuş 已编辑,您能否再次运行并告诉它执行了多长时间?
  • 8.4150 秒,我的旧代码在 4 秒内运行,其中 D.Aktif='1' 和 (D.DuaTuru = 2 或 D.DuaTuru = 1 和 D.DuaID 不在 (选择DISTINCT(DuaID) from EDILEN_DUALAR where PID='L3FNCPEVME36')) order by D.Tarih DESC LIMIT 9
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 2023-04-02
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 2010-10-30
相关资源
最近更新 更多