我正在尝试构建类似的facebook风格的消息传递系统(对话)。
这是对话表。
DESCRIBE conversation;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| c_id | int(11) | NO | PRI | NULL | auto_increment |
| user_one | int(11) | NO | | NULL | |
| user_two | int(11) | NO | | NULL | |
| ip | varchar(30) | NO | | NULL | |
| time | int(11) | NO | | NULL | |
+----------+-------------+------+-----+---------+----------------+
现在,在用户可以阅读对话之前,我需要检查对话(c_id)是否存在,以及用户是否是给定对话ID的所有者。 撰写此查询的最佳方式是什么??
我所拥有的,不起作用的例子:
$cid = intval($_GET['cid']);
$conv = $this->db->fetchRow('SELECT c_id FROM `conversation` WHERE
user_one=? OR
user_two=? AND
c_id=?',
array($this->user->id, $this->user->id, $cid));
if ($conv) {
// get the conversation replies etc..
}
答案 0 :(得分:1)
我看到了一些问题。
一个是你似乎忽略了AND
的优先级高于OR
。所以你的条件的逻辑就像你用这样写的方式一样:
WHERE user_one=? OR (user_two=? AND c_id=?)
虽然我猜你想要逻辑以这种方式工作:
WHERE (user_one=? OR user_two=?) AND c_id=?
但是,如果你打算如何工作,我想知道你为什么需要搜索用户id,因为c_id=?
上的条件只会选择一行(如果没有匹配则为零行) ,因为它正在搜索一个特定的主键值。