我正在制作一个基于cookie的收藏系统,需要根据存储在cookie中的唯一用户ID连接来自两个表的数据,这样我就可以判断哪些项目被标记为收藏夹。
我知道我需要做一个JOIN但是没有太多地使用它们并且还没有真正了解它们。
从db中选择项目的现有查询:
$query = mysql_query("SELECT *, UNIX_TIMESTAMP(`date`) AS `date` FROM songs WHERE date >= DATE_SUB( NOW( ) , INTERVAL 2 WEEK ) ORDER BY date DESC");
我的收藏夹表设置为:ID FAVORITE USERID,其中ID是主键,FAVORITE是表歌曲中的歌曲ID,USERID是存储在cookie中的哈希。
我需要加入来自收藏夹表的所有行,其中USERID字段与cookie哈希变量匹配。
我还需要收集与歌曲ID匹配的收藏夹中的总行数,这样我就可以显示将项目设置为收藏的人数,这样我就可以显示有多少人喜欢它。但也许需要将其作为一个单独的查询?
答案 0 :(得分:1)
应该这样做,我想:
$user_id = intval($_COOKIE['user_id']);
$query = mysql_query(sprintf("
SELECT *
FROM songs s
INNER JOIN favorites f
ON f.favorite = s.id
WHERE f.userid = %s
", $user_id));
您应该read up关于不同类型的连接。
然后要获得返回的总行数,您只需在结果上调用mysql_num_rows
:
$favorite_song_count = mysql_num_rows($query);
编辑:要选择所有收听的歌曲,请注意哪些收藏,请执行以下操作:
$query = mysql_query(sprintf("
SELECT s.*, f.id as favorite_id
FROM songs s
LEFT JOIN favorites f
ON f.favorite = s.id AND f.userid = %s
", $user_id));
通过将其从INNER JOIN切换到LEFT JOIN,即使在收藏夹表中没有相应的记录,我们也会选择所有歌曲。任何提供user_id
收藏夹的歌曲都会为favorite_id
设置非NULL值。
答案 1 :(得分:0)
您可以在连接条件中拥有逻辑(和,或...)运算符:
select t1.*
from t1
join t2 on t1.id = t2.fid and t2.foo = 'blah'
如果您还要查询每首歌曲被“收藏”的总次数,那么您还需要一个按照构造分组的方式,如下所示:
select *, count(f.id)
from songs as s
left join favorites as f on s.id = f.favorite and f.userid = <hash>
group by s.id