根据cookie数据连接两个表

时间:2009-07-14 06:24:12

标签: php mysql

我正在制作一个基于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匹配的收藏夹中的总行数,这样我就可以显示将项目设置为收藏的人数,这样我就可以显示有多少人喜欢它。但也许需要将其作为一个单独的查询?

2 个答案:

答案 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