如何编写这个mysql连接查询然后按需要订购?

时间:2013-05-23 03:44:48

标签: php mysql

我有两个表“小部件”和“点击”,两个表共享一个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的点击次数进行排序。

回顾一下,将点击列添加到窗口小部件表可能会更容易,但我认为在路上分离还有其他优势。

3 个答案:

答案 0 :(得分:2)

使用Joins可以实现您想要做的事情。您可以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";

当然,这是假设clicks.clicks列存储小部件中的点击量。

附加

您还可以考虑存储每次单击,使用每次点击的唯一标识符(或日期时间,IP地址和ID属性中的复合键)添加日期时间属性和主键,以便您可以单独跟踪每个点击每个小部件。然后,您可以使用COUNT()字符串中的SELECT为每个小部件选择点击次数。取决于您尝试对数据库执行的操作。

答案 1 :(得分:1)

$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

答案 2 :(得分:0)

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

SELECT fields a, fields b
FROM widgets a JOIN clicks b
ON a.id = b.id
ORDER BY clicks