Mysql

在 MySQL 視圖上執行“ORDER BY CASE”查詢之後會破壞它

  • April 7, 2016

每當我創建一個 MySQL 視圖,然後執行一個使用 排序結果的查詢時ORDER BY CASE WHEN (...),該視圖就會變得不可用。

新創建的視圖工作正常,所有 SQL 都是正確的。

這是我嘗試從視圖中查看所有記錄時收到的錯誤消息(或者當我在 phpMyAdmin 中點擊“瀏覽”時):

#1064 - You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use
near 'THEN0 ELSE1 END LIMIT 0, 30' at line 1

這是範例架構:

CREATE TABLE `comments` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `user_id` int(11) NOT NULL,
 `title` varchar(256) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
INSERT INTO `comments` (`id`, `user_id`, `title`) VALUES
(1, 1, 'user one comment 1'),
(2, 1, 'user one comment 2'),
(3, 2, 'user two comment 1'),
(4, 2, 'user two comment 2');

CREATE TABLE `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(256) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `users` (`id`, `name`) VALUES
(1, 'user1'),
(2, 'user2');

範例視圖:

CREATE VIEW view_sample AS
SELECT
 c.id AS comment_id,
 c.title AS comment_title,
 u.name AS user_name
FROM comments c, users u
WHERE c.user_id = u.id

此時,您可以驗證上面的視圖是否正常工作並顯示結果。

將破壞一切的範例查詢:

SELECT * FROM view_sample
WHERE comment_title LIKE 'user one%'
ORDER BY CASE WHEN comment_title LIKE 'user one%' THEN 1 ELSE 0 END, comment_title

上面的查詢會起作用,但你之後嘗試做的任何事情都會失敗。試試這個:

SELECT * FROM view_sample

我試過幾次,有不同的看法。

我究竟做錯了什麼?

  1. 語法錯誤:需要在 THEN 和 0 (eq. ELSE) 之間添加空格。

我在 SqlFiddle 上嘗試了您的架構/查詢:

MySql 5.5.32(在這裡顯示

MySql 5.6.6 m9(在這裡顯示

並一起工作。

請檢查您的 PhpMyAdmin 可能有問題

引用自:https://dba.stackexchange.com/questions/53173