2014-05-09 81 views
0

你好我有2个表中的mysql表中的帖子和表post_meta 我想根据post_meta键/值数据查询帖子表。 示例中的第一个查询= statment正在工作,第二个查询的!= statment不起作用。任何帮助?SQL元相关查询

如何用postmeta键排除帖子[hide] = value ['1']?

这里的期望结果

enter image description here

例如

//显示交其中postmeta键[隐藏] =值1

SELECT 
    * 
FROM 
    post AS mt0 
INNER JOIN post_meta AS mt1 ON mt0.id = mt1.postid 
WHERE 
    (
     mt1.`key` = 'hide' 
     AND CAST(mt1.`value` AS CHAR) = 1 
    ) 

2行
1后试验1个3 1 1个隐藏

3后测试3 4 3隐藏1个

//显示交其中postmeta键[隐藏]!=值1

SELECT 
    * 
FROM 
    post AS mt0 
INNER JOIN post_meta AS mt1 ON mt0.id = mt1.postid 
WHERE 
    (
     mt1.`key` = 'hide' 
     AND CAST(mt1.`value` AS CHAR) != 1 
    ) 

0行

//为什么呢?这个查询必须返回后2

DB模式

----table post 

CREATE TABLE `post` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 


INSERT INTO `post` VALUES ('1', 'Post test 1'); 
INSERT INTO `post` VALUES ('2', 'Post test 2'); 
INSERT INTO `post` VALUES ('3', 'Post test 3'); 


----table post_meta 

CREATE TABLE `post_meta` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `postid` int(11) DEFAULT NULL, 
    `key` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `value` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

INSERT INTO `post_meta` VALUES ('1', '1', 'name', 'leone'); 
INSERT INTO `post_meta` VALUES ('2', '2', 'name', 'mario'); 
INSERT INTO `post_meta` VALUES ('3', '1', 'hide', '1'); 
INSERT INTO `post_meta` VALUES ('4', '3', 'hide', '1'); 

回答

3

第二届查询不因条件下工作

mt1.`key` = 'hide' 

有在查询

SELECT 
    * 
FROM 
    post AS mt0 
INNER JOIN post_meta AS mt1 ON mt0.id = mt1.postid 
WHERE 
    (
     mt1.`key` = 'hide' 
     AND CAST(mt1.`value` AS CHAR) != 1 
    ) 
仔细看

您有一个条件为

mt1.`key` = 'hide' 

然后你使用

AND CAST(mt1.`value` AS CHAR) != 1 

现在在post_meta表检查存在与

key = hide and value != '1' 

没有数据因此条件失败,你会得到0的结果

这里是什么你提供的

INSERT INTO `post_meta` VALUES ('1', '1', 'name', 'leone'); 
INSERT INTO `post_meta` VALUES ('2', '2', 'name', 'mario'); 
INSERT INTO `post_meta` VALUES ('3', '1', 'hide', '1'); 
INSERT INTO `post_meta` VALUES ('4', '3', 'hide', '1'); 

随着问题提供更新,你可以得到的结果作为

SELECT * 
FROM 
post AS mt0 
INNER JOIN post_meta mt1 
ON mt0.id = mt1.postid 
AND mt0.id NOT IN (
    select postid from post_meta where `key` = 'hide' AND CAST(`value` AS CHAR) = 1 
); 

DEMO

+0

感谢Abhik的答案。如何用postmeta hide = 1排除帖子? – nikmauro

+0

欢迎您!我不知道你能否在问题中加上你期待的结果。这对我来说更容易想象它。 –

+0

@nikmauro你在看这个吗? http://sqlfiddle.com/#!2/372cb/10 –