0

我有一个查询,它从名为 的表中返回每一行posts,我现在已将照片添加到帖子中,因此当用户上传新照片时,它将在帖子中创建一行,然后显示上传的新照片。我有这一切工作,问题是当用户删除照片时,我不希望从帖子中返回该行。

这就是我到目前为止所得到的,它仍然返回所有行。

SELECT p.* FROM posts p WHERE p.toID='$id' AND p.state='0' AND


(
    (
        p.type = '2' AND
        p.post = ANY (SELECT ph.id FROM photos ph WHERE ph.state='0' AND ph.id=p.post)
    ) 
    OR 
    (
        p.type!='2' //I had to add this because it wasn't returning any other posts types 
                        //if there weren't any of the `type=2`, how could I also fix that?
    )
)

ORDER BY p.id DESC LIMIT 10

所以为了知道返回该post行需要检查的是是否ph.state等于0,如果不等于0则意味着照片已被删除。

编辑

还有没有办法强制p.post成为一个intval?数据库中的列是 varchar,因为它通常存储基于文本的帖子

表结构:

CREATE TABLE `photos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userID` int(11) NOT NULL,
  `photo` varchar(255) NOT NULL,
  `description` longtext NOT NULL,
  `albumID` int(11) NOT NULL,
  `state` int(11) NOT NULL,
  `date` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=651 ;

-- --------------------------------------------------------


CREATE TABLE `posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `toID` int(11) NOT NULL,
  `fromID` int(11) NOT NULL,
  `post` longtext NOT NULL,
  `type` int(11) NOT NULL,
  `state` int(11) NOT NULL,
  `date` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=380 ;
4

2 回答 2

0

尝试这个:

SELECT DISTINCT p.* 
FROM posts p 
LEFT JOIN photos ph ON p.post  = ph.id AND ph.state = 0 
WHERE p.toID='$id' AND p.state = 0 AND 
        ((ph.id IS NULL AND p.type = 2) OR p.type != 2) 
ORDER BY p.id DESC 
LIMIT 10;
于 2013-01-07T18:35:39.053 回答
0

你把 '0'它改成0不带引号的地方

你把 '2'它改成2不带引号的地方

编辑:

让它间隔就这样做

p.type < somenumber 和 p.type > someothernumver

于 2013-01-07T18:01:30.973 回答