社交时间轴SQL逻辑

时间:2014-08-21 18:22:01

标签: php mysql sql

我对MySQL天才没有经验,所以请原谅我。我有2张桌子,

  • 表1包含列名:post_id (int, Auto Increment), post (varchar, user posts) and like (int) {like is incremented when a user likes the post e.g similar to facebook likes}

  • 表2包含列名:id (int, Auto Increment) and post_id(int, foreign key to TABLE 1), user_id(varchar, User who liked this post)

现在这里对我来说是棘手的部分,我想从表1中选择所有帖子,并在用户请求时间线时向用户表明已经通过表2喜欢哪个帖子,从而阻止用户喜欢再次发布帖子,例如喜欢在Instagram或任何其他社交网络上工作,即不像已经喜欢的那样。

我尝试使用PHP和MySQL:基本上我根据用户检索时间线检索了表1中的所有帖子,然后根据需要时间线的用户检索了表2中的所有数据,然后检查是否与表1的返回数据和表2的返回数据匹配。在时间线中每个返回的帖子我标记1以在代码中指示传入的帖子已被喜欢而0表示不喜欢然后我向用户显示相应的UI流程这样做我可以确保用户不喜欢相同的帖子两次。

从表2中选择所有

SELECT * FROM `TABLE_2` WHERE `username` = :username

从表1中选择

SELECT * FROM `TABLE_1` WHERE `reporter` IN (SELECT `destination_id` FROM `followers` WHERE `source_id` = :username)
         UNION
         SELECT * FROM `TABLE_1` WHERE `reporter` = :username
         ORDER BY `created_at` DESC LIMIT 20

上述查询根据其他逻辑和某些其他因素返回用户时间轴

现在我比较表1和表2中返回的数据

if($likes != NULL)
{
   $count = 0;
   foreach($returnedtimeline["posts"] as $single)
   {
       if(array_search($likes[$count], $single) == "id")
       {
              $returnedtimeline["posts"][$count]["liked"] = 1;
              $count++;
       }else{
              $returnedtimeline["posts"][$count]["liked"] = 0;
              $count++;
            }
  }

但我相信有一种更好的方法可以通过一个直接查询而不是多个查询来实现这一点,因为我的方法在时间,数据量和服务器处理能力方面都有很大的缺点。

2 个答案:

答案 0 :(得分:0)

我相信你只想加入你的select,一次从两个表中返回列。类似的东西:

select
    post_id,
    case when "Table 2".post_id is null then 0 else 1 end as UserHasLiked
from "Table 1"
left join "Table 2" on "Table 1".post_id = "Table 2".post_id

我不是MYSQL用户,所以语法可能有些偏差,但我觉得它应该非常接近。

答案 1 :(得分:0)

SELECT DISTINCT *,
CASE WHEN likes.face_id = persona.face_id THEN '1' ELSE '0' END liked,
CASE WHEN dislikes.face_id = persona.face_id THEN '1' ELSE '0' END disliked,
CASE WHEN comments.face_id = persona.face_id THEN '1' ELSE '0' END commented
FROM persona, likes, dislikes, comments
RIGHT JOIN tagged ON tagged.phone_id = :pid WHERE persona.face_id = tagged.face_id

就像魔法一样。