簡體   English   中英

該查詢應該做什么? (為什么會失敗?)

[英]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細語”:

  1. 該查詢試圖做什么?
  2. 為什么它可以在某些以前的版本上使用,但現在不再可用?
  3. 如何更改查詢以使其再次工作?

預先感謝一百萬。

更新:
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM