[英]What is this query supposed to do? (and why does it fail?)
我的任務是恢復舊版舊軟件。 它曾經在舊服務器(2012年)上運行,但該服務器以丑陋的方式死亡(硬盤故障)。 在該服務器死亡之前,代碼可以正常工作。
我已經從備份中重建了MySQL數據庫和數據。
但是,一個查詢不起作用並且失敗,並顯示錯誤: Query preparation failed: Unknown column '_operationId' in 'where clause'
。 有問題的查詢是:
SELECT
@r AS _operationId
, @r := (
SELECT
operationId
FROM operations
WHERE operationId = _operationId
) AS includesOperationId
FROM (SELECT @r := %i) AS tmp
INNER JOIN operations
WHERE @r > 0 AND @r IS NOT NULL
據我了解,該查詢嘗試重新加入自身,以構建某種樹?
由於某種原因,該查詢必須已經在某些早期版本的MySQL(5.0 ??)上運行,但是對於當前版本(MySQL 5.7),該查詢將失敗。
有沒有可以向我解釋的“ mysql細語”:
預先感謝一百萬。
更新:
operations
表定義和數據:
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| operationId | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| operation | varchar(40) | NO | UNI | NULL | |
| description | text | YES | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
+-------------+-----------+-------------+
| operationId | operation | description |
+-------------+-----------+-------------+
| 1 | add | NULL |
| 2 | delete | NULL |
| 3 | edit | NULL |
| 4 | view | NULL |
| 5 | disable | NULL |
| 6 | execute | NULL |
+-------------+-----------+-------------+
這個評論太長了。
該查詢正在嘗試進行某種樹遍歷。 我不知道它可以在任何版本的MySQL中使用,但是我最大的猜測是意圖是這樣的:
SELECT @r AS _operationId,
@r := (SELECT operationId
FROM operations
WHERE operationId = @r
) AS includesOperationId
FROM operations CROSS JOIN
(SELECT @r := %i) params
WHERE @r > 0 AND @r IS NOT NULL;
話雖如此,如果這碰巧起作用,則不能保證它會再次起作用或在其他版本的MySQL中起作用。 這違反了使用變量的兩個規則:
SELECT
一個表達式中分配的變量不應在另一個表達式中使用。 沒有定義表達式的評估順序,因此可以按任何順序評估表達式。 WHERE
子句中的條件,並且絕對不能保證有關SELECT
某種“順序”評估。 子查詢也是有問題的。
好消息是,如果operations
沒有名為_operationId
列,則查詢將在所有版本的MySQL上失敗,並帶有未定義的列類型錯誤(盡管也許舊版本做得很時髦)。
壞消息是,如果要遍歷MySQL中的層次結構,則需要更改數據結構或使用存儲過程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.