Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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 - Fatal编程技术网

Php 如何编写这个mysql连接查询,然后根据需要进行排序?

Php 如何编写这个mysql连接查询,然后根据需要进行排序?,php,mysql,Php,Mysql,我有两个表“widgets”和“clicks”,两个表共享一个ID列 我需要编写一个查询,通过id连接小部件和单击表,然后我需要按单击顺序返回数据,因此单击次数最多的小部件首先返回,然后再返回 我至少尝试过将初始查询组合在一起,但我仍然需要帮助: $query = "SELECT widgets.id AS w_id, clicks.id AS c_id, widgets.manf_id AS w_manf, widgets.name

我有两个表“widgets”和“clicks”,两个表共享一个ID列

我需要编写一个查询,通过id连接小部件和单击表,然后我需要按单击顺序返回数据,因此单击次数最多的小部件首先返回,然后再返回

我至少尝试过将初始查询组合在一起,但我仍然需要帮助:

       $query = "SELECT widgets.id AS w_id, 
       clicks.id AS c_id, 
       widgets.manf_id AS w_manf,
       widgets.name AS w_name, 
       widgets.widgetlink AS w_link, 
       widgets.type_id AS w_type_id, 
       widgets.image_url AS w_url, 
       clicks.clicks AS c_clicks 
       FROM widgets, clicks WHERE widgets.id = clicks.id ";
其他重要信息:

一些小部件可能没有任何点击,因此我需要收集两个表中的所有信息,然后按每个id的点击量排序


回顾过去,在widgets表中添加clicks列可能会更容易,但我认为分离还有其他好处。

您想要做的事情可以通过使用来实现。您可以
从两个表中选择所需的列,并通过
widget_id
将它们连接起来,以便显示所有小部件,而不受点击量的影响:

$query = "SELECT w.id AS w_id, 
                 c.id AS c_id, 
                 w.manf_id AS w_manf,
                 w.name AS w_name, 
                 w.widgetlink AS w_link, 
                 w.type_id AS w_type_id, 
                 w.image_url AS w_url, 
                 c.clicks AS c_clicks 
          FROM widgets w
          LEFT JOIN clicks c ON w.id = c.id 
          ORDER BY c.clicks DESC";
当然,这是假设clicks.clicks列存储小部件中的点击量

额外的

您还可以考虑存储每个单独的单击,使用每次单击的唯一标识符(或来自日期时间、IP地址和ID属性的复合键)添加DATETIME属性和主键,这样您就可以单独跟踪每个小部件上的每一个命中。然后,您可以使用

select
字符串中的
COUNT()
来选择每个小部件的点击量。取决于您试图对数据库执行的操作。

您可以发布表并指示要显示的字段吗?你可以这样做

SELECT fields a, fields b
FROM widgets a JOIN clicks b
ON a.id = b.id
ORDER BY clicks
就这么简单。我不知道你为什么要重命名这些字段,但这似乎有点不必要

在大多数情况下,在MySQL中,您只需要从查询中指定所需的内容。而MySQL将选择最佳的执行方式,并为您获得结果

编辑: 通过添加以下行(考虑合理的数量)来限制结果总是好的:


这是很好的工作,但让我们假设我有50个小部件,其中只有10个有点击?我仍然希望显示左表中剩余的四十个小部件。因此,
left JOIN
。它将显示第一个表中的所有记录,而不考虑联接表中的相应值。实施啊,太完美了…我以为我有左派加入,但我没有。非常感谢,效果很好。
$query = "
SELECT w.id AS w_id, 
   c.id AS c_id, 
   w.manf_id AS w_manf,
   w.name AS w_name, 
   w.widgetlink AS w_link, 
   w.type_id AS w_type_id, 
   w.image_url AS w_url, 
   c.clicks AS c_clicks 
FROM widgets w, click c
WHERE w.id = c.id 
ORDER BY c.clicks DESC";
LIMIT 10