繁体   English   中英

数据库查询的 PHP 和 MySQL 问题

[英]PHP and MySQL Issues with database query

我有一个包含 userId、movieId 和 date 的 MySQL 表。 我的查询有问题。 我想查询并列出每个 userId 下标有 movieId 的不同日期。


userId movieId  date
  1     A     1:00PM
  1     A     3:00PM
  2     A     2:00PM
  2     C     8:00PM
  2     C     9:00PM

我想要这样的东西


UserId --Movie(Time)
  1    A     1:00PM, 3:00PM
  2    A     2:00PM
  2    C     8:00PM,9:00PM

使用group_concat函数

select UserId ,movieId, group_concat(date separator ',') 
from your_table group by UserId ,movieId 

编辑:我没有足够的声誉来评论上面接受的答案,但是它将破坏MySQL的更高版本,我认为这不是发布者真正想要的-它不会产生他们所说的想要的输出。

您需要使用GROUP BY将几行折叠为一。 然后,您想使用聚合功能将这些行中的数据连接起来。 聚合函数是一种将多行作为输入并对其进行处理以返回单个值的函数。 在这种情况下,您需要group_concat。

但是,如果使用GROUP BY,则需要告诉MySQL如何处理从结果中选择的每个单元素。 这是因为在ANSI SQL中,语句必须是确定性的。 即每次为相同的输入返回相同的输出。 较旧的MySQL版本会为您“猜测”值,但默认情况下,较新的版本(5.7.5及更高版本)不会。 另外,最好还是明确告诉MySQL如何处理每个值。 所以你想要这样的东西:

SELECT userId, ANY_VALUE(movieId), GROUP_CONCAT(date SEPARATOR ", ") 
FROM tableName GROUP BY UserId;

上面将为您提供每个用户ID和日期列表。 但是电影代码将被随机选择。

或者您想要这样的东西:

SELECT userId, GROUP_CONCAT(movieId SEPARATOR ", "), GROUP_CONCAT(date SEPARATOR ", ")
FROM tableName GROUP BY UserId;

这将为您提供与以前相同的功能,但是它将列出所有影片代码,而不是随机选择任何值。

或者,您想按userId和movieID分组,以便可以为每个用户和电影组合使用一行。 然后,您将在最后更改GROUP BY子句,如下所示:

SELECT userId, movieId, GROUP_CONCAT(date SEPARATOR ", ")
FROM tableName GROUP BY UserId, movieId;

我提供了三个不同的选项,因为我认为即使您要求第一个,您实际上也可能想要第三个。

MySQL版本很重要。 如果您使用的是MySQL 5.7之前的版本,那么AnyValue(…)函数将不存在,您只需将其删除,然后单独放置“ movieId”即可。 但是,如果您在MySQL 5.7之后进行购买,并且还想以正确的方式进行操作,则应将其包括在内。

另外,有两个建议。 首先,除非有充分的理由,否则不要将字母用作movieID。 使用与用户ID相似的整数,并将有关电影的所有信息放在单独的表中,movieID是键。 其次,在表中添加一个名为“ id”的列,并将其设置为主键。 这使许多事情变得容易得多。 您可以将id字段设置为AUTO_INCREMENT-这是正常的事情。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM