我正在制作一个社交媒体类型的网站,人们可以发布消息并成为朋友等。
所以我有一个包含下表的数据库。
友
+-----+-----------+----------+----------+--------+
| id | Bevriend | UserID1 | UserID2 | vType |
+-----+-----------+----------+----------+--------+
| 1 | 1 | 1 | 3 | 0 |
+-----+-----------+----------+----------+--------+
博客
+-----+----------------+-------+---------+
| id | title | text | userid |
+-----+----------------+-------+---------+
| 1 | My first entry | Test | 1 |
+-----+----------------+-------+---------+
我想写一个类别的查询,只能从我和我的朋友那里获取博客文章。 只要UserID1或UserID2包含来自我的会话的用户ID并且在数据库中,名为“Bevriend”的位设置为1就应该获取记录。
我很遗憾,如果我需要向您提供更多信息,请告诉我。
答案 0 :(得分:1)
我给你一个可能有帮助的查询。它只需要朋友发布的博客项目,而不是当前用户。您的查询应该如下(不包括当前用户是作者的博客帖子):
SELECT
b.*
FROM Blog b
INNER JOIN Friends f ON (b.userid = f.UserID1 OR b.userid = f.UserID2)
WHERE
f.Bevriend = 1
AND
(
b.userid = f.UserID1 AND f.UserID2 = '{$currentUserID}'
OR
b.user_id = f.UserID2 AND f.UserID1 = '{$currentUserID}'
)
我们在这里做的是以这样的方式加入表格,UserID1
或UserID2
显示为博客记录“所有者”。然后在where子句中我们说只给我这些博客记录,其中所有者是我的朋友而不是我 ,每列UserID1
和{{1 }}
这应该与CI一样(包括当前用户是作者的博客文章):
UserID2
您可以使用GROUP BY或DISTINCT调整要检索的列,排序和删除重复项。我们在此处运行自定义查询,因为当查询变得更复杂时,使用$currentUserID = (int) $this->session->userdata('userID');
$page = (int) $this->input->get('page'); // example retrieving of desired page num
$pagesize = (int) $this->config->item('blog_pagesize'); // example retrieving of pagesize
// Prevent unexpected behavior
if(0 >= $page)
$page = 1;
// Prevent unexpected behavior
if(0 >= $pagesize)
$pagesize = 20; // If config is wrong we ensure it will continue to work
// Additional page checks go here...
$query = $this->db->query('
SELECT
b.*
FROM Blog b
INNER JOIN Friends f ON (b.userid = f.UserID1 OR b.userid = f.UserID2)
WHERE
f.Bevriend = 1
AND
( f.UserID2 = ? OR UserID1 = ?)
LIMIT ?, ?
', array($currentUserID, $currentUserID, ($page - 1) * $pagesize, $pagesize));
foreach ($query->result() as $row) {
echo $row->id;
echo $row->title;
echo $row->text;
}
// Clean up at the end
$query->free_result();
,$this->db->select
,$this->db->from
,$this->db->join
等更加清晰。如果你使用它们,你必须传递第三个参数$this->db->where
来禁用每个逃脱的函数,它看起来像“丑陋的代码”。
您无法通过true
直接使用自定义查询分页。这是因为它是CI查询,但不是活动记录。下面我将查询翻译成活动记录。
使用默认CI活动记录功能:
$this->db->query
上面的例子应该可以让你使用默认的分页,虽然我觉得它不是很有用和灵活。