SQL查询 - 在一列上区分不同的其他值(使用INNER JOIN)

时间:2017-03-08 13:30:18

标签: mysql sql select inner-join distinct

我很欣赏之前已经在这里提出类似于此问题的问题,但到目前为止我还没有能够实现我的代码中提供的答案,因为他们想要仅在一列中区分副本而另一列保持相同而且我的代码中的INNER JOIN。 INNER JOIN是有问题的,因为大多数提供的答案都使用PARTITION函数,并且作为SQL的新手,我不知道如何将它与它集成。仅使用INNER JOIN和PARTITION的建议将非常有用。

虽然我可以在Python中进行后导出(我将使用所需的输出),但此代码目前输出约200万行,这使得使用和检查非常耗时。这是代码:

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让我更接近所需的输出,但不是在它后面留下一个重复的行就会删除它们。关于使用该功能同时保留一个重复行的建议将是优选的。我在数据库的只读连接上,所以看到here的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-enum组合都应过滤为仅发生一次。这不是任何ip-enum组合的原因是多个用户可以通过相同的IP地址连接。

2 个答案:

答案 0 :(得分:0)

你只是想要聚合吗?

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;

每个client_ip_address将返回一行,每个语言代码都以逗号分隔列表。

您还可以使用MIN()MAX()language_enum_code获取client_ip_address的任意值。

答案 1 :(得分:0)

如果您不关心为每个user_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