2011-12-24 29 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))) 

...你在指定排序规则。