导致 where 子句出错的别名 - MySQL
Alias name causing error in the where clause - MySQL
我的 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
Error : #1054 - Unknown column 'Okudum' in 'where clause'
我写了
SELECT COUNT(1)
FROM EDILEN_DUALAR
WHERE DuaID = D.DuaID
AND PID = 'L3FNCPEVME36') AS Okudum
但我仍然在查询中遇到错误。
您需要使用 having 子句代替 where。否则您需要提供完整的参考名称 table 例如
我编辑我的答案,请参阅
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
您的 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
你可以试试这个。这应该 运行 比我的第一个答案快,假设您在 DUALAR.Aktif
和 DUALAR.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;
我的 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
Error : #1054 - Unknown column 'Okudum' in 'where clause'
我写了
SELECT COUNT(1)
FROM EDILEN_DUALAR
WHERE DuaID = D.DuaID
AND PID = 'L3FNCPEVME36') AS Okudum
但我仍然在查询中遇到错误。
您需要使用 having 子句代替 where。否则您需要提供完整的参考名称 table 例如 我编辑我的答案,请参阅
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
您的 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
你可以试试这个。这应该 运行 比我的第一个答案快,假设您在 DUALAR.Aktif
和 DUALAR.DuaTuru
.
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;