【问题标题】:Relationships in MySQL and QUERY problemMySQL中的关系和QUERY问题
【发布时间】:2011-01-26 13:11:03
【问题描述】:

您好,我有两个关于 MySQL 和 QUERIES 的问题。

  • 首先,我想知道如果我在 phpmyadmins 设计器中设置表之间的关系,或者我不设置,它在形成查询时会有什么不同?

  • 其次,我有 3 个表并且在我的查询中有一些逻辑错误,似乎 MAX() 函数和 GROUP BY 不能很好地结合在一起://

所以如果有人知道如何解决我的问题,请分享:)

是的,我使用的是 MySQL 5.1.41,并建立了表之间的关系

CREATE TABLE  `sandbox`.`videos` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`title` VARCHAR( 255 ) NOT NULL ,
`views` INT NOT NULL ,
`id_user` INT UNSIGNED NOT NULL ,
`id_type` INT UNSIGNED NOT NULL ,
INDEX (  `id_user` ,  `id_type` )
) ENGINE = INNODB;

id title views id_user id_type
------------------------------------
1 video1 50  1  1
2 video2 55  3  1
3 video3 100  2  3
4 video4 20  5  3
5 video5 62  4  5



CREATE TABLE  `sandbox`.`users` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 50 ) NOT NULL
) ENGINE = INNODB;

id name
-----------
1 adam
2 mike
3 chuck
4 walker
5 nancy



CREATE TABLE  `sandbox`.`types` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 50 ) NOT NULL
) ENGINE = INNODB;

id name
-------------
1 20 min
2 30 min
3 50 min
4 90 min
5 120 min

我的查询:

SELECT videos.id, videos.title, MAX(videos.views) AS views, users.name AS user, types.name AS type 
FROM videos, users, types 
WHERE videos.id_user = users.id 
AND videos.id_type = types.id 
GROUP BY id_type  
ORDER BY id_type ASC
LIMIT 0 , 20;

查询结果:

id title views user type
------------------------------------
1 video1 55  adam 20 min
3 video3 100  mike 50 min
5 video5 62  walker 120 min

GROUP BY 函数按类型对所有条目进行分组,并仅从组中的第一个条目中获取数据,但由于 MAX() 函数,它会从视图中复制最高值并将其写入组中的第一个条目。

想要的结果:

id title views user type
------------------------------------
1 video2 55  chuck 20 min
3 video3 100  mike 50 min
5 video5 62  walker 120 min

我需要的是它选择所有数据(标题和用户名),不仅查看数据并按类型分组。

感谢任何帮助:)

【问题讨论】:

标签: mysql phpmyadmin relationship


【解决方案1】:

首先,聚合函数如 MIN(), MAX, AVG(), COUNT(), SUM() 如果涉及另一列,例如您的示例,都将使用 group by... 它需要知道在什么休息时间考虑每个组...(除了来自 CustomerAccount 的 SELECT MAX(Balance) 之类的东西——无论是谁或什么,这都会获得最大的余额)。

您需要做的是预先查询您的条件,然后获取与该限定符关联的元素。

SELECT 
      id_type, 
      max( views )
   from
      videos
   group by 
      id_type

现在,这给了我最内在的资格预审...对于每种类型的视频,无论 ID 是多少,最大值是多少。现在,如果出现多个视频具有相同计数的问题,我还将在二级查询中使用 ID 的 MIN() 限定符。

select 
      PreQuery.id_type,     
      min( v.ID ) as FirstVideoIDByType
   from
      ( SELECT 
             id_type, 
             max( views )
          from
             videos
          group by 
             id_type ) PreQuery,
      Videos v
   where 
      PreQuery.id_type = v.id_type
   group by 
      PreQuery.id_type

最后,我现在将拥有每个视频类型的最大观看次数的 ID 的第一个实例,现在,获取这些特定视频的详细信息

select 
      FinalVideo.*
   from
      ( select 
             PreQuery.id_type,     
             min( v.ID ) as FirstVideoIDByType
          from
             ( SELECT 
                    id_type, 
                    max( views )
                 from
                    videos
                 group by 
                    id_type ) PreQuery,
             Videos v
          where 
             PreQuery.id_type = v.id_type
          group by 
             PreQuery.id_type ) PreQuery2,
      Videos v2
   where
      PreQuery2.FirstVideoIDByType = v2.id
   order by
      v2.id_type
   limit
      0, 20;

希望这能阐明事物如何以及为什么会以它们的方式工作......有时分解元素以获得您真正想要的东西很复杂。

如果您想包含所有可能与相同最大观看次数相关的视频,您可以跳过辅助查询,但加入相同的最大观看次数,通过

select 
      FinalVideo.*
   from
      ( SELECT 
              id_type, 
              max( views ) MaxViews
           from
              videos
           group by 
              id_type ) PreQuery,
       Videos v
    where 
           PreQuery.id_type = v.id_type
       and PreQuery.MaxViews = v.views
   order by
      v.id_type
   limit
      0, 20;

【讨论】:

    【解决方案2】:

    试试这个不是很好的方法,但可能仍然适合您的要求

    SELECT *,MAX(result.views) AS views FROM(SELECT videos.id, videos.title, users.name AS user, types.name AS type 
        FROM videos, users, types 
        WHERE videos.id_user = users.id 
        AND videos.id_type = types.id ORDER BY videos.views DESC) AS `result` 
        GROUP BY `result`.`id_type`  
        ORDER BY  `result`.id_type ASC
        LIMIT 0 , 20;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多