2014-05-09 86 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 –