- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
mySQL 的完全新手。所以任何帮助将不胜感激。
我有 3 个表 -- carts
、users
、actions
。
carts:
+------------+-------------+-------+
| cartId | session_id | userId|
+------------+-------------+-------+
users:
+----------+-------------+
| usedId | email |
+----------+-------------+
actions:
+-------------+------------------+---- ---------+
| session_id | impressionAction | impressionId |
+-------------+------------------+-----+--------+
在carts
中,每一行有一个session_id
。
在users
中,每一行有一个userId
。
在 actions
中,每个 session_id
有多行,用于计算该 session 的所有操作。
我想JOIN
三个表得到类似的输出
+------+-------------+--------+------------------+--------------+-------+
userId | session_id | cartId | impressionAction | impressionId | email |
+------+-------------+--------+------------------+--------------+-------+
每个 userId
和 session_id
有多行;本质上是一个扁平化的文件。我认为如果我们在 userId
上 JOIN
carts
和 users
导致说 A
和然后 JOIN
A
和 actions' on
session_id`,我们到家了。
样本预期输出是:
+------------+-------------+--------+------------------+--------------+---------+
userId | session_id | cartId | impressionAction | impressionId | email |
+------------+-------------+--------+------------------+--------------+---------+
| 1234 | abc3f45 | 0001 | LOGIN | 2032 |ab@yc.com|
| 1234 | abc3f45 | 0001 | ADD | 4372 |ab@yc.com|
| 1234 | abc3f45 | 0001 | ADD | 4372 |ab@yc.com|
| 1234 | abc3f45 | 0001 | SENDMAIL | ab@yc.com |ab@yw.com|
| 4567 | def4rg4 | 0002 | LOGIN | 2032 |db@yw.com|
| 4567 | def4rg4 | 0002 | ADD | 4372 |db@yw.com|
| 4567 | def4rg4 | 0002 | REMOVE | 3210 |db@yw.com|
+------------+-------------+--------+------------------+--------------+---------+**
我不知道如何在没有一个公共(public)键的情况下连接 3 个表。我什至不知道它叫什么类型的连接。
本质上,我们试图连接 3 个具有非重叠键的表,通过第一个 JOIN
收集一个公共(public)键,然后将中间键与第三个连接。这称为 CROSS JOIN
吗?如果没有,有名字吗?
最佳答案
摘自你上面的评论
A USER may select many products, add them to their CART; a singleUSER may have multiple CARTS and at the end of the event, they canEMAIL the cart to themselves; the ACTIONS of the user are stored inthe actions table
这就是我对结构的看法(考虑到您的数据)
+---------------------+ +---------------------+ +---------------------+
| users | | carts | | actions |
+---------------------+ +---------------------+ +---------------------+
| user_id [PK] |--| | cart_id [PK] | | impression_id [PK] |
| email | |--| user_id [FK] | | action_name |
| | | product_id [FK] | |--| session_id [FK]* |
+---------------------+ | session_id [FK]* |--| | |
| | +---------------------+
+---------------------+
正如您在上面看到的,我首先加入购物车,然后加入操作,因为只有桌面购物车同时具有用户和 session 数据。
购物车和操作上 session_id 旁边的 [FK]*
可能看起来是外键,但在这种情况下它不是 - 因为没有单独的 session 表将其放置为PK(主键)
您询问了join
- 它与inner join
相同。 INNER JOIN 通过基于连接谓词组合两个表(A 和 B)的列值来创建一个新的结果表。该查询将 A 的每一行与 B 的每一行进行比较,以找到满足连接谓词的所有行对。
这是一个可能的表格内容
+------------------------+
| users |
+------------------------+
| id | email |
+------+-----------------+
| 1 | first@mail.org |
| 2 | second@mail.org |
| 3 | third@mail.org |
+------+-----------------+
+------------------------------------------+
| carts |
+------------------------------------------+
| id | user_id | product_id | session_id |
+------+---------+------------+------------+
| 1 | 1 | 5 | 1aaaa |
| 2 | 2 | 5 | 2ffff |
| 3 | 3 | 8 | 3ddddd |
| 4 | 1 | 5 | 1aaaaa |
| 5 | 3 | 9 | 3bbbbb |
| 6 | 1 | 6 | 1ccccc |
+------+---------+------------+------------+
+-------------------------------+
| actions |
+-------------------------------+
| id | name | session_id |
+------+-----------+------------+
| 1 | ADD | 1aaaa |
| 2 | ADD | 2ffff |
| 3 | SENDMAIL | 3ddddd |
| 4 | ADD | 3ddddd |
| 5 | SENDMAIL | 2ffff |
| 6 | ADD | 1aaaaa |
| 7 | REMOVE | 3ddddd |
| 8 | ADD | 1ccccc |
| 9 | ADD | 3bbbbb |
| 10 | SENDMAIL | 3bbbbb |
+------+-----------+------------+
如您所见,表格购物车中有六个产品,表格操作中正好有六个 add
操作。此外,正如您所见,id=1 的用户购买了三种产品,但不是同时购买,因为有两个 session ; id=3 的用户也在不同时间购买了这两种产品等等...
SQL语句
SELECT u.user_id, c.session_id, c.cart_id, a.impression_id, a.action_name, u.email
FROM users AS u
INNER JOIN carts AS c ON c.user_id = u.user_id
INNER JOIN actions AS a ON a.session_id = c.session_id
ORDER BY u.user_id, c.session_id, c.cart_id
结果:
+---------+------------+---------+---------------+-------------+-----------------+
| user_id | session_id | cart_id | impression_id | action_name | email |
+---------+------------+---------+---------------+-------------+-----------------+
| 1 | 1aaaa | 1 | 1 | ADD | first@mail.org |
| 1 | 1aaaa | 1 | 6 | ADD | first@mail.org |
| 1 | 1aaaa | 4 | 1 | ADD | first@mail.org |
| 1 | 1aaaa | 4 | 6 | ADD | first@mail.org |
| 1 | 1cccc | 6 | 8 | ADD | first@mail.org |
| 2 | 2ffff | 2 | 5 | SENDMAIL | second@mail.org |
| 2 | 2ffff | 2 | 2 | ADD | second@mail.org |
| 3 | 3bbbb | 5 | 9 | ADD | third@mail.org |
| 3 | 3bbbb | 5 | 10 | SENDMAIL | third@mail.org |
| 3 | 3dddd | 3 | 3 | SENDMAIL | third@mail.org |
| 3 | 3dddd | 3 | 4 | ADD | third@mail.org |
| 3 | 3dddd | 3 | 7 | REMOVE | third@mail.org |
+---------+------------+---------+---------------+-------------+-----------------+
注意
:不保证 session 的唯一性。
(更新)工作 SQL Fiddle
更新:(查找和删除重复项)
我已经更新了 SQL Fiddle为了模拟重复记录(当用户在同一 session 中添加相同的产品时)。使用以下语句,您将能够检索那些重复的行。
SELECT c.card_id, c.user_id, c.product_id, c.session_id, a.action_name, a.impression_id
FROM cards As c
INNER JOIN actions AS a ON a.session_id = c.session_id
GROUP BY c.user_id, c.product_id, c.session_id, a.action_name
HAVING count(*) > 1
结果:
+---------+------------+------------+------------+-------------+-----------------+
| card_id | user_id | product_id | session_id | action_name | impression_id |
+---------+------------+------------+------------+-------------+-----------------+
| 1 | 1 | 5 | 1aaaa | ADD | 1 |
| 6 | 1 | 6 | 1cccc | ADD | 8 |
+---------+------------+------------+------------+-------------+-----------------+
在上述语句的 SELECT 部分中,您可以省略除 card_id 和 impression_id 之外的所有内容。在一个语句中删除这两个重复项有点棘手,因为您不能修改在同一查询的子查询中选择的同一个表。在这种情况下,我会避免棘手的部分(涉及另一个内部子查询),并会使用如下单独的语句删除重复项
-- delete duplicates from cards
--
DELETE FROM WHERE card_id IN (1,6)
-- delete duplicates from actions
--
DELETE FROM WHERE card_id IN (1,8)
更好的是,您可以检查用户是否已经添加了所选产品并且不要添加两次。
关于使用多列/键的 MySQL JOIN 3 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24639504/
我有两个具有不同格式的相似数据的数据框 df1: Nodo X Y Z CTB3901 CTBX3901 CTBY3901 CTBZ3901
这个问题在这里已经有了答案: Using tuples in SQL "IN" clause (9 个回答) 关闭 8 年前。 我尝试获得一些满足特定条件的用户: SELECT * FROM use
我目前正在使用 MySQL (5.7) 来查询成员表。 当我执行如下查询时: SELECT fname, lname, added FROM Members WHERE ((fname, lname)
我正在使用 CSS 创建多个列,以提供与 Pinterest 界面类似的外观(例如,框列,但整齐地堆叠在彼此之下)。 这是我使用的代码: #feed-post-home .feed { -mo
我正在使用 VLookup 函数来查找列中存在的多个值。这工作得很好,但只需要很多时间,因为我在 Excel 表中有 100,000 行。 有什么办法可以加快这段代码的速度吗? 该代码基本上在列中查找
如果这个词正确的话,我有 4 列和 4 个不同的参数。每个参数大约有 3-5 个变量。我想做的是在维护不同列的同时创建 4 个不同参数的所有可能组合。因此,假设我有以下示例: **Column A |
我正在尝试使用 arrange_()使用字符串输入并按降序排列在其中一列中。 library(dplyr) # R version 3.3.0 (2016-05-03) , dplyr_0.4.3 #
我只是想知道是否有可以包含多列的 wpf 组合框控件? 如果没有,我需要使用什么 XAML 来实现这一目标? 如果可能的话,我只是在寻找一个基本的两列组合框, 谢谢 最佳答案 请引用这些链接 多列组合
我想使用 Select 根据第二个表中的值更新表中的多个列语句来获取这样的值: UPDATE tbl1 SET (col1, col2, col3) = (SELECT colA, colB, col
如果我们需要根据给定列的某些值集查询表,我们可以简单地使用 IN 子句。 但是如果需要基于多列执行查询,我们不能使用 IN 子句(在 SO 线程中 grepped)。 从其他 SO 线程,我们可以使用
我需要用分隔值拆分表中两列的值。 我的源表如下所示: 产品IDean_upc已批准21029618710103368021;8710103368038;87101033680141;0;1929236
我正在尝试在 WPF 中创建一个包含多列的 TreeView 。我很清楚,关于这个主题确实有很多问题。但是,他们在绑定(bind)数据时似乎采用了不同的方法。每个人似乎都设置了 itemssource
我正在尝试使用以下数据在 Excel 中创建数据透视表: 我试图得出的最终结果(使用枢轴)是这样的摘要: 但是我不知道如何让 Excel 计算/添加/考虑所有列。我可以为每个单独的字段/列创建一个数据
我正在尝试在 WPF 中创建一个包含多列的 TreeView 。我很清楚,关于这个主题确实有很多问题。但是,他们在绑定(bind)数据时似乎采用了不同的方法。每个人似乎都设置了 itemssource
如何在最多几列的每行返回 1 个值: 表名 [Number, Date1, Date2, Date3, Cost] 我需要返回这样的东西: [Number, Most_Recent_Date, Cos
我有两个数据框想要连接在一起(自行车骑行数据框和自行车站数据框)。 我一直在使用 pandas 库,但我似乎无法编写代码来完美地操作连接。最初,我只是加入关键“station_id”,但我发现最近更新
我有以下 csv 文件,我想要内部联接 CSV 1:Trip_Data.csv (250MB) head -2 rand_trip_data_1.csv medallion,hack_license,
我知道以前也有人问过类似的问题。但是,我的问题略有不同。我正在尝试跨多个列获取 merge_asof 的功能。这是数据集: import pandas as pd left = pd.DataFram
我有一个数据库,里面保存着客户的数据。我需要知道我们在各个城市和国家有多少客户。我必须用单个查询来完成它。 我的表是客户,我有城市和国家列(均为varchar),其中包含有关它的信息。 所需的查询输出
我需要左连接两个表:Cardealers 和Applications。 我想查看哪些信用卡经销商收到了哪些申请。 每个申请都会转发给三个发卡商,因此我的表结构具有以下 3 列:receiver_1、r
我是一名优秀的程序员,十分优秀!