Mysql SQL查询-在一列上对另一列的不同值进行不同查询(使用内部联接)
我很感激之前有人在这里提出过类似的问题,但到目前为止,我无法在我的代码中实现提供的答案,因为我只想区分一列中的重复项,而另一列保持不变,以及代码中的内部联接。内部连接是有问题的,因为提供的大多数答案都使用分区函数,而且作为SQL的新手,我不知道如何将其与之集成。建议只使用带分区的内部连接将非常有用 虽然我可以用Python进行后期导出(在这里我将使用所需的输出),但这段代码目前输出约200万行,这使得处理和检查非常耗时。代码如下:Mysql SQL查询-在一列上对另一列的不同值进行不同查询(使用内部联接),mysql,sql,select,inner-join,distinct,Mysql,Sql,Select,Inner Join,Distinct,我很感激之前有人在这里提出过类似的问题,但到目前为止,我无法在我的代码中实现提供的答案,因为我只想区分一列中的重复项,而另一列保持不变,以及代码中的内部联接。内部连接是有问题的,因为提供的大多数答案都使用分区函数,而且作为SQL的新手,我不知道如何将其与之集成。建议只使用带分区的内部连接将非常有用 虽然我可以用Python进行后期导出(在这里我将使用所需的输出),但这段代码目前输出约200万行,这使得处理和检查非常耗时。代码如下: SELECT client_ip_address, langua
SELECT client_ip_address, language_enum_code
FROM vw_user_session_log AS usl
INNER JOIN vw_user_topic_ownership AS uto
ON usl.user_id = uto.user_id
使用SELECT DISTINCT而不是SELECT可以使我更接近所需的输出,但它不会在后面留下一个重复的行,而是会删除所有的行。建议在保留一个重复行的同时使用此函数。我使用的是与数据库的只读连接,因此,只有当我能够从查询输出中生成一个临时的可查询表时,才会使用DELETE-FROM方法,我认为这是不可能的,而且看起来很笨拙
原始数据样本:
user_id: client_ip_address: language_enum_code: (other stuff...)
4 194:4:62:18 107
2 101:9:23:34 14
3 180:4:87:99 15
3 194:4:62:18 15
4 166:1:19:27 107
2 166:1:19:27 14
预期结果:
user_id: client_ip_address: language_enum_code: (other stuff...)
4 194:4:62:18 107
2 101:9:23:34 14
3 180:4:87:99 15
如您所见,任何id枚举组合都应该被筛选为只出现一次。这不是任何ip枚举组合的原因是,多个用户可以通过相同的ip地址连接。您只是想要聚合吗
SELECT client_ip_address, GROUP_CONCAT(DISTINCT language_enum_code)
FROM vw_user_session_log usl INNER JOIN
vw_user_topic_ownership uto
ON usl.user_id = uto.user_id
GROUP BY client_ip_address;
这将为每个客户机ip\u地址返回一行,每个语言代码以逗号分隔列表
您还可以使用MIN()
或MAX()
为每个客户端ip地址的language\u enum\u code
获取任意值
SELECT client_ip_address, GROUP_CONCAT(DISTINCT language_enum_code)
FROM vw_user_session_log usl INNER JOIN
vw_user_topic_ownership uto
ON usl.user_id = uto.user_id
GROUP BY client_ip_address;
这将为每个客户机ip\u地址返回一行,每个语言代码以逗号分隔列表
您还可以使用MIN()
或MAX()
为每个客户机的language\u enum\u code
ip\u地址
获取任意值,如果您不关心为每个用户id/enum组合保留哪个ip地址,则应该执行以下操作:
SELECT user_id, min(client_ip_address), language_enum_code
FROM vw_user_session_log AS usl
INNER JOIN vw_user_topic_ownership AS uto
ON usl.user_id = uto.user_id
where client_ip_address is not null
group by user_id, language_enum_code
如果您不关心为每个用户\u id/enum组合保留哪个IP地址,那么类似的操作应该可以:
SELECT user_id, min(client_ip_address), language_enum_code
FROM vw_user_session_log AS usl
INNER JOIN vw_user_topic_ownership AS uto
ON usl.user_id = uto.user_id
where client_ip_address is not null
group by user_id, language_enum_code
请提供原始数据和预期结果的示例,但仍在寻找理想的答案。如果我理解正确,您希望该组合具有唯一的用户id、语言、枚举代码和任意客户端ip地址吗?因为在您的“期望结果”中,您丢弃了数据,例如“166:1:19:27”。您是如何选择保留哪些IP地址和丢弃哪些IP地址的?一旦这些地址被导出,我将通过一个数据库运行IP地址,并将其转换为国家/地区。同一用户不太可能使用来自两个不同国家的应用程序,因此我忽略了最终丢失的IP。我猜您的原始数据不完整。由于您的查询中有2个表,但只显示了1个表数据。请提供原始数据和预期结果的示例,并且仍然在寻找理想的答案。如果我理解正确,您希望该组合具有唯一的用户id、语言枚举代码和任意客户端ip地址吗?因为在您的“期望结果”中,您丢弃了数据,例如“166:1:19:27”。您是如何选择保留哪些IP地址和丢弃哪些IP地址的?一旦这些地址被导出,我将通过一个数据库运行IP地址,并将其转换为国家/地区。同一用户不太可能使用来自两个不同国家的应用程序,因此我忽略了最终丢失的IP。我猜您的原始数据不完整。因为您的查询中有2个表,但只显示了1个表数据。谢谢您的回答。我决定通过Python将其过滤掉,但这是一种有趣的方法,非常有效。谢谢你的回答。我决定通过Python将其过滤掉,但这是一种有趣的方法,它可以工作,但会产生一个新问题。在此筛选器之前,必须筛选出空IP值。我不知道把“where IP!”放在哪里空的声明-如果你能在这里帮助我,这将是答案。完成了,现在就试试看太棒了!你知道为什么吗!=NULL不起作用?这是一个语法问题,有些数据库会接受!=NULL,但因为NULL不是一个值,而是没有任何值,所以不同的数据库对它的处理不同。我刚刚从经验中了解到,如果数据库接受“is not null”语法,这通常是最安全的选择。同样,对于相反的“is null”,这是可行的,但会产生一个新问题。在此筛选器之前,必须筛选出空IP值。我不知道把“where IP!”放在哪里空的声明-如果你能在这里帮助我,这将是答案。完成了,现在就试试看太棒了!你知道为什么吗!=NULL不起作用?这是一个语法问题,有些数据库会接受!=NULL,但因为NULL不是一个值,而是没有任何值,所以不同的数据库对它的处理不同。我刚刚从经验中了解到,如果数据库接受“is not null”语法,这通常是最安全的选择。同样,对于相反的“为空”。