【问题标题】:Sorting MySQL table rows by a favorites table按收藏夹表对 MySQL 表行进行排序
【发布时间】:2014-03-15 10:56:11
【问题描述】:

我已经有一个高级 mysql 查询。按用户收藏的上传、搜索关键字和日期范围过滤结果。

现在我需要在此之上添加另一个排序。我想按最喜欢的人订购这整件事。大多数收藏夹是通过计算收藏夹表中upload_ids 的出现来计算的。它应该按最喜欢的 last_update 排序。

我已经查看了 mysql 查询的 COUNT() 元素,但是很难理解我是如何在这个已经很高级的语句构造中得到它的......另外因为最喜欢的事情发生在另一个表中。

我有三个mysql表: + 用户(ID、日期、用户、密码) + 上传(id、user_id、日期、last_update、描述、标签、online_state) + 收藏夹(id、日期、user_id、upload_id)

$query = 'SELECT * FROM uploads WHERE online_state = 1';//select all online uploads



//FILTER FAVORITES //$favorites_ids are the favorites of the logged in user, being queried in another statement

if  ($upload_display_sort == 'favorites')

$query .= ' AND id IN ('.implode(',', $favorites_ids).')';//returns 1,2,3,4,5



//FILTER SEARCH

if  (   isset($_GET['tags'])    )

$query .= ' AND MATCH (description,tags) AGAINST ("'.urldecode($_GET['tags']).'")';



//FILTER DATE

if  (   isset($_GET['timeframe'])

    and (   $_GET['timeframe'] == '3days'

        or  $_GET['timeframe'] == '2weeks'

        or  $_GET['timeframe'] == '3months')    )

{

    $end_date = time();//current time in unix format

    switch  (   $_GET['timeframe']  )

    {
        case '3days':   $start_date = strtotime('-3 days',$end_date);   break;
        case '2weeks':  $start_date = strtotime('-2 weeks',$end_date);  break;
        case '3months': $start_date = strtotime('-3 months',$end_date); break;
        default:        $start_date = strtotime('');    break;//1970-01-01 01:00:00
    }

    $end_date = date("Y-m-d H:i:s", $end_date);//current time in mysql format

    $start_date = date("Y-m-d H:i:s", $start_date);//end time in mysql format

    $query .= ' AND last_update BETWEEN "'.$start_date.'" AND "'.$end_date.'"';

}

【问题讨论】:

    标签: php mysql sorting favorites


    【解决方案1】:

    如果我理解正确,您需要计算每个上传 id 的收藏夹数量。您可以通过聚合和连接来做到这一点:

    SELECT u.*
    FROM uploads u left outer join
         (select upload_id, count(*) as num
          from favorites f
          group by upload_id
         ) f
         on u.id = f.upload_id
    WHERE online_state = 1
    

    然后,在查询的末尾添加:

    ORDER BY f.num desc
    

    获得您想要的订单。注意 SQL 语句的顺序很重要,所以order by 必须在where 之后。

    【讨论】:

    • 是的,收藏夹表包含上传和用户之间的收藏链接。而且我需要计算最喜欢的上传ID(user_ids) - 所以在收藏夹表中出现最多的upload_id是最受欢迎的。并且需要按此订购上传表。
    • @handle 。 . .这是我的解释,也是解决方案应该做的。
    • 我已经用你的代码更新了我的代码,但它似乎不起作用。我也想了解到底发生了什么。你能解释一下吗?这是我在第一个查询变量定义中添加的内容:$query = 'SELECT u.* FROM uploads u left outer join'。 '(SELECT upload_id, COUNT(*) AS num FROM favorites f'. 'GROUP BY upload_id) f ON u.id = f.upload_id'。 'WHERE online_state = 1';//选择所有在线上传
    • 我将最后一行更新为:$query .= ' ORDER BY f.num DESC, last_update DESC';
    • 我在我的收藏列表中上传了一个最喜欢的。但它并没有首先出现在结果中。我正在尝试在 sqlfiddle.com 上构建这个东西 - 也许这对我有帮助。
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2012-10-10
    • 2014-03-12
    • 2013-10-08
    相关资源
    最近更新 更多