我正在开发一个PHP投票系统,我想检查登录用户投票的帖子和显示投票,如果用户投票。我想在一个查询中执行它而不使用多个quires。 帖子表
+---------+--------+--------+
| post_id | title | c_id |
+---------+--------+--------+
| 1 | post 1 | 2 |
| 2 | post 2 | 3 |
| 3 | post 3 | 2 |
| 4 | post 4 | 1 |
+---------+--------+--------+
MySQL循环
SELECT *
FROM posts
LEFT
JOIN categories
ON categories.cat_id = posts.c_id
WHERE posts.c_id = categories.cat_id
AND posts. active = 1
ORDER
BY posts.post_id DESC
LIMIT 0, 10
投票表
+---------+--------+---------+
| vote_id | p_id | u_id |
+---------+--------+---------+
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 2 | 2 |
| 4 | 4 | 1 |
+---------+--------+---------+
登录user = $uid
因此,如果我在上面的MySQL循环中运行查询它可以正常工作
SELECT * FROM votes WHERE u_id = $uid AND p_id= $post_id
有没有办法合并这两个查询?
答案 0 :(得分:3)
SELECT *
FROM posts P
LEFT
JOIN categories C
ON C.cat_id = P.c_id
LEFT JOIN (SELECT p_id FROM votes WHERE u_id = $uid) V
ON V.p_id=P.post_id
WHERE P. active = 1
ORDER
BY P.post_id DESC
LIMIT 0, 10 ;
答案 1 :(得分:1)
LEFT JOIN
投票表(如果您不想要空联接,也不需要左连接类别)。如果用户已投票,则会在连接列中显示值 - 否则将加入空值。
SELECT *
FROM posts AS p
INNER JOIN categories AS c ON c.cat_id = p.c_id
LEFT JOIN votes AS v ON p.post_id = v.p_id AND v.u_id = $uid
WHERE p.active = 1
ORDER BY p.post_id DESC
LIMIT 0, 10
未投票的帖子在投票列中会有空值,但由于您只想知道用户是否投票,您可能会限制输出数据(只获得您需要的内容)指定具体字段并使voted
列返回1 /仅限0值:
SELECT p.*, c.title, ..., IF(v.vote_id; 1; 0) AS voted
答案 2 :(得分:0)
您可以使用针对投票表和帖子表中的常用字段的联接,如下所示:
<?php
$sql = "SELECT * FROM votes AS V LEFT JOIN posts AS P ON V.p_id=P.post_id
WHERE (V.u_id={$uid} AND V.p_id={$post_id}) GROUP BY V.u_id";
答案 3 :(得分:0)
您无法在列中选择投票作为数组,但您实际上可以提取投票并对其进行分组。所以基本上我们要做的就是部分地加入两个表并且可以总结所有的投票
SELECT p.*, c.*, sum(v.Score) FROM posts p LEFT JOIN categories c ON c.cat_id = p.c_id LEFT JOIN votes v ON p.post_id = v.p_id WHERE p.active = 1 AND v.u_id = $uid GROUP BY p.post_id ORDER BY p.post_id DESC LIMIT 0, 10
你可以看到我总结了投票中的所有分数,以防重复