Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按收藏夹表对MySQL表行进行排序_Php_Mysql_Sorting_Favorites - Fatal编程技术网

Php 按收藏夹表对MySQL表行进行排序

Php 按收藏夹表对MySQL表行进行排序,php,mysql,sorting,favorites,Php,Mysql,Sorting,Favorites,我已经有了一个高级mysql查询。按用户喜欢的上传、搜索关键字和日期范围过滤结果 现在我需要在这上面添加另一个命令。我想按最爱的人点这整件东西。大多数收藏夹是通过计算收藏夹表中上载ID的出现次数来计算的。它应该按最爱、最新更新排序 我已经研究了mysql查询的COUNT元素,但是很难理解我是如何在这个已经很高级的语句构造中得到它的。。。也因为最喜欢的东西在另一张桌子上 我有三个mysql表: +用户id、日期、用户、通行证 +上载id、用户id、日期、上次更新、说明、标记、联机状态 +收藏夹id

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

现在我需要在这上面添加另一个命令。我想按最爱的人点这整件东西。大多数收藏夹是通过计算收藏夹表中上载ID的出现次数来计算的。它应该按最爱、最新更新排序

我已经研究了mysql查询的COUNT元素,但是很难理解我是如何在这个已经很高级的语句构造中得到它的。。。也因为最喜欢的东西在另一张桌子上

我有三个mysql表: +用户id、日期、用户、通行证 +上载id、用户id、日期、上次更新、说明、标记、联机状态 +收藏夹id、日期、用户id、上载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.'"';

}

如果我理解正确,您需要计算每个上载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之后。

是的,favorites表包含上传和用户之间的偏好链接。我需要用最常用的用户id来计算上传id,所以在favorites表中出现最多的上传id是最常用的。并且需要按此顺序排列上载表。@handle。这就是我的解释,这就是解决方案应该做的。我已经用你的代码更新了我的代码,但它似乎不起作用。我也想知道到底发生了什么。你能解释一下这件事吗。下面是我在第一个查询变量定义中添加的内容:$query='SELECT u.*FROM uploads u left outer join'。'选择上载id,将*从收藏夹f中计数为num'。“按上载id分组在u.id上=f.upload\u id”。“在线位置_state=1”//选择所有在线上传,我将最后一行更新为:$query.='orderbyf.numdesc,last_updatedesc';我有一个上传在我的收藏夹表,这是最伪造的。但它并没有首先出现在结果中。我正在努力把这件事建立起来——也许这对我有帮助。