2011-12-24 30 views
-1

我有一個數據庫,保存一些人的信息。Mysql查看相似的條件

我發送以下查詢:

(select 'NUMBER OF BRAND PARTNERS ACTIVE PROMOTERS' AS `NUMBER OF ACTIVE PROMOTERS`,count(*) AS `COUNT(*)` from `Registration_Summary` where promoter not like "bw%") 

和它的作品完美,但每當我創建一個視圖來保存這個命令時,「凡子不喜歡‘BW%’」部分被完全忽略,爲什麼?!這麼奇怪 ?!彷彿視圖不能有「喜歡」的狀態!

我的觀點的命令是:

CREATE VIEW test AS 
(select 'NUMBER OF BRAND PARTNERS ACTIVE PROMOTERS' AS `NUMBER OF ACTIVE PROMOTERS`,count(*) AS `COUNT(*)` from `Registration_Summary` where promoter not like "bw%") 

我想我的問題應該是我如何創建基於一個「其中像」語句另一種觀點認爲一個看法?

+0

您是否嘗試過使用單引號?:'不喜歡'bw%'' – 2011-12-24 14:17:16

+0

@ypercube這是正確的SQL,但MySQL允許使用單引號和雙引號。 – 2011-12-24 14:18:18

+0

@imad:'SHOW CREATE VIEW test'返回什麼? – 2011-12-24 14:25:52

回答

2

我認爲別的可能會出錯。複製你的問題,如:

create table `Registration_Summary` (
    id integer primary key, 
    promoter varchar(200) 
); 

insert into `Registration_Summary` (id, promoter) values (1, 'bar1'); 
insert into `Registration_Summary` (id, promoter) values (2, 'bar2'); 
insert into `Registration_Summary` (id, promoter) values (3, 'bar3'); 
insert into `Registration_Summary` (id, promoter) values (4, 'foo1'); 
insert into `Registration_Summary` (id, promoter) values (5, 'foo1'); 
insert into `Registration_Summary` (id, promoter) values (6, 'foo1'); 
insert into `Registration_Summary` (id, promoter) values (7, 'foo1'); 
insert into `Registration_Summary` (id, promoter) values (8, 'afoo1'); 
insert into `Registration_Summary` (id, promoter) values (9, 'bfoo1'); 
insert into `Registration_Summary` (id, promoter) values (10, 'cfoo1'); 

從登記表

select * from `Registration_Summary` where promoter like 'foo%'; 

選擇將產生如下輸出

+----+----------+ 
| id | promoter | 
+----+----------+ 
| 4 | foo1  | 
| 5 | foo1  | 
| 6 | foo1  | 
| 7 | foo1  | 
+----+----------+ 

select * from `Registration_Summary` where promoter not like 'foo%'; 

會產生以下

+----+----------+ 
| id | promoter | 
+----+----------+ 
| 1 | bar1  | 
| 2 | bar2  | 
| 3 | bar3  | 
| 8 | afoo1 | 
| 9 | bfoo1 | 
| 10 | cfoo1 | 
+----+----------+ 

所以創建視圖像你有

create or replace view testview as (select 'NUMBER OF BRAND PARTNERS ACTIVE PROMOTERS' AS `NUMBER OF ACTIVE PROMOTERS`,count(*) AS `COUNT(*)` from `Registration_Summary` where promoter not like 'foo%'); 

,然後從視圖

SELECT * FROM testview; 

選擇產生正確的輸出是

+-------------------------------------------+------------+ 
| NUMBER OF ACTIVE PROMOTERS    | COUNT(*) | 
+-------------------------------------------+------------+ 
| NUMBER OF BRAND PARTNERS ACTIVE PROMOTERS |   6 | 
+-------------------------------------------+------------+ 
+0

這是什麼讓我瘋狂! select命令完全正常,但每當我把它放在一個視圖中時,它會給我一個錯誤的答案,就是你的例子中的10而不是6。什麼可能導致這個問題?!它可以從我使用的name.com的phpmyadmin?! – imad 2011-12-25 07:59:44

+0

@imad我試着複製一個本地的phpMyAdmin v3.4.5,我有但我再也不能。如果我嘗試通過SQL窗口創建視圖或執行查詢並再次使用底部的「創建視圖」選項,則視圖會正常創建並顯示正確的結果。也許這是一個好主意,也可以在本地副本中進行測試(如果有的話)。 – efrag 2011-12-25 08:37:05

+0

我不能使用本地數據庫,我不得不在name.com上使用公共數據庫 – imad 2011-12-25 08:40:59

0

我想我知道什麼是問題。我在另一個視圖上發佈where條件而不是表格,我認爲這就是爲什麼我沒有得到正確的答案。我對嗎 ?

我還是沒有解決問題,但是當我使用它的工作表中的SELECT命令創建視圖,但是當我用它來從另一個視圖中選擇,它使用Where語句時給出了錯誤的答案。

+0

如果這能解決您的問題,我會說您是對的。可以?如果是的話,你應該在這個答案中說清楚。否則它不是答案。 – Kai 2011-12-25 09:35:18

+0

@imad:你還沒有向我們展示'SHOW CREATE VIEW view_name'返回的內容。 – 2011-12-25 13:27:09

+0

如果我們用user1112145編寫的例子,SHOW CREATE VIEW view_name將返回10而不是6 – imad 2011-12-26 06:36:02

0

回覆舊線程是因爲我遇到了可能是相同的問題。

DROP TABLE IF EXISTS like_test; 

CREATE TABLE like_test (
    id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Unique ID' 
    ,textvalue varchar(64) COLLATE ucs2_bin NOT NULL 
    ,PRIMARY KEY (id) 
) ENGINE=InnoDB CHARSET=ucs2 COLLATE=ucs2_bin; 

INSERT INTO like_test (textvalue) 
VALUES 
('foofoo') 
,('foobar') 
,('barfoo') 
,('barbar'); 

DROP VIEW IF EXISTS view_like_test; 

CREATE VIEW view_like_test AS 
SELECT 
    id 
    ,textvalue 
FROM like_test 
WHERE textvalue NOT LIKE 'foo%'; 

SHOW CREATE VIEW view_like_test; 

MySQL的內部的mangling後,視圖已經剝離LIKE條件:

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `symbols_mgr`@`%` 
    SQL SECURITY DEFINER 
VIEW `view_like_test` AS 
    select 
     `like_test`.`id` AS `id`, 
     `like_test`.`textvalue` AS `textvalue` 
    from 
     `like_test` 
    where 
     (not ((`like_test`.`textvalue` like ''))) 

的字符集/歸類導致要被清空的LIKE條件 - 所以或許OP也有類似的表結構。

我在版本5.1 - 也許這從那時起停止成爲一個問題。有一個快速去5。5等條件改變這一點:

(not ((`like_test`.`textvalue` like '\0\0\0f\0\0\0o\0\0\0o\0\0\0%'))) 

如果它是可行的,使得數據更加香草爲MySQL(例如拉丁/ ASCII)可能是解決該問題的最簡單的方法。或者你可以這樣改變視圖:

(not ((`like_test`.`textvalue` like 'foo%' collate utf8_bin))) 

...你在指定排序規則。