我如何写这个mysql连接查询,然后按我需要的顺序


How do I write this mysql join query and then order as I need?

我有两个表"widgets"answers"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表中添加一个click列可能更容易,但我认为分离还有其他好处。

您想做的可以通过使用join来实现。您可以从两个表中SELECT您想要的列,并通过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";

当然,这是假设点击。单击列存储小部件中的单击次数。

额外

您还可以考虑存储每个单独的点击,添加一个datetime属性和一个主键,为每个点击使用唯一标识符(或datetime, ip地址和id属性的复合键),这样您就可以单独跟踪每个小部件上的每个点击。然后,您可以使用SELECT字符串中的COUNT()来选择每个小部件的点击量。

$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";

就是这么简单。我不知道你为什么要重命名字段,但这似乎有点不必要。

在MySQL的大多数情况下,你只需要指定你想从查询中得到什么。而MySQL会选择最优的方式来执行它,并为你得到结果。

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

LIMIT 10

你能张贴你的表格并指出你想要显示的字段吗?你可以这样做。

SELECT fields a, fields b
FROM widgets a JOIN clicks b
ON a.id = b.id
ORDER BY clicks
相关文章: