在 MySQL 上获取以下内容的查询是啥?
Posted
技术标签:
【中文标题】在 MySQL 上获取以下内容的查询是啥?【英文标题】:What query to obtain the following on MySQL?在 MySQL 上获取以下内容的查询是什么? 【发布时间】:2012-02-29 05:00:11 【问题描述】:用户
+--------+--------------+----------+--------------+
| userID | userUsername | userName | userLastName |
+--------+--------------+----------+--------------+
| 6 | richard | Ricardo | Vega |
| 10 | jason | Jason | Bourne |
+--------+--------------+----------+--------------+
补货
+-----------+-------------+--------+--------+-----------------+
| restockID | restockDate | itemID | userID | restockQuantity |
+-----------+-------------+--------+--------+-----------------+
| 1 | 2012-02-29 | 1 | 6 | 48 |
| 2 | 2012-02-29 | 1 | 10 | 100 |
| 3 | 2012-02-29 | 2 | 10 | 50 |
| 4 | 2012-02-29 | 2 | 6 | 100 |
| 5 | 2012-02-29 | 2 | 6 | 200 |
| 6 | 2012-02-29 | 2 | 10 | 2000 |
| 7 | 2012-02-29 | 1 | 10 | 2000 |
+-----------+-------------+--------+--------+-----------------+
物品
+--------+--------------------+
| itemID | itemName |
+--------+--------------------+
| 1 | Coca Cola (lata) |
| 2 | Cerveza Sol (lata) |
+--------+--------------------+
好的,我已按要求提供了一些示例数据。我需要得到这张桌子:
+--------+--------------------+---------------+-------------+----------+--------------+--------------+
| itemID | itemName | itemExistence | restockDate | userName | userLastName | userUsername |
+--------+--------------------+---------------+-------------+----------+--------------+--------------+
| 2 | Cerveza Sol (lata) | 2350 | 2012-02-29 | Jason | Bourne | jason |
| 1 | Coca Cola (lata) | 2148 | 2012-02-29 | Ricardo | Vega | richard |
+--------+--------------------+---------------+-------------+----------+--------------+--------------+
但是,我需要 restockDate 成为每个 itemName 的最新日期。在示例中,它显示了第一次补货,而不是最新的补货。我只需要显示该项目的存在情况以及上次补货时间,而不是第一次。
如果我的表不太好,请建议一个新的架构。
我知道这可能很多,所以我会向可以帮助我的人支付 5 美元(Paypal)小费。承诺。
【问题讨论】:
如果您可以提供一些示例数据(如表格),我们可能会了解您到底在寻找什么。这是example question 你的意思是你应该为每个用户一个不同的 itemName,即按用户 ID 或用户名和 itemId 分组 你的 "WHAT I NEED" 部分需要更多解释。一个项目与许多用户和 restockDates 相关。那么,如果每个项目有一行,那么输出中应该有多少用户(和 restockDates)中的哪一个? 什么是itemExistence
?
itemExistence = 旧库存 + 新库存。谢谢:)
【参考方案1】:
如 cmets 中所述,许多补货可以在同一天进行,因此在这种情况下无法比较日期。这里提供了两个选项:使用来自restocks
表的增量 PK 或重组表。对于第一种情况,这是解决方案:
select i.itemID, i.itemName, i.itemExistence, r.restockDate, u.userName,
u.userLastName, u.userUsername
from items i
left join (
select r1.restockDate, r1.itemID, r1.userID from restocks r1
left join restocks r2
on r1.itemId = r2.itemId and r1.restockId < r2.restockId
where r2.restockDate is null
) as r on i.itemID = r.itemID
inner join users u on r.userID = u.userID
对于第二种情况,重构意味着将日期字段更改为唯一的日期时间,该日期时间将唯一标识一条记录。这是最好的解决方案,但是,它确实需要更新表中存在的任何先前数据。这意味着,为单个产品更新所有具有相同日期的记录并为其设置不同的日期时间。
懒惰的人(比如我)会选择第一个选项 :) 如果您对此有任何疑问,请告诉我。
【讨论】:
试过了。谢谢。我刚刚按要求提供了样本数据。我希望这有助于澄清事情。 我的 Mostacho 朋友,我试过了,它带来了很多结果。我只需要 itemName 是 Distinct,我的意思是,例如,只有一个名为 Coca-Cola 的 itemName 是他最后一次补货。 Cerveza 也是如此,只有一个 Cerveza 和他的最后一次补货。任何物品都一样。我希望你能帮助我。这些查询越来越可怕:P 大声笑,我们又来了:P。我的结果表显示如下: itemID 是每个 itemName 的唯一 ID。 restockDate 我想成为最后一次重新进货 itemName。一件物品可以进货 N 次,并记录一个日期。我只需要显示 LAST RESTOCK DATE 和 WHO (userName, userLastName, userUsername) 就可以了。换句话说,我需要的只是列出项目并显示最后一次更新的人。但我只需要列出每个项目一次。例如:可口可乐商品有很多补货,但我只需要最后一个和谁做的。 更多信息:Jason、Ricardo 或 John Doe 可以为任何商品补货。例如,我可以为每个人补货,然后,您使用系统,Mostacho 会更新所有这些。当我运行查询时,它必须将所有物品和您的姓名显示为“负责人”,因为您是最后一个补货的人。无需展示我的股票,只展示你的股票,因为它们是最新的。希望这能澄清事情。非常感谢您宝贵的时间和帮助我的朋友。 如果我在同一天有 2 个相同产品的补货,我想展示最新的一个。也许我可以将 restockDate 更改为 DATETIME,或者我们可以使用 restockID,这样我们就可以根据 restockID(自动增量)判断新的内容是什么。我无法用您的数据回答我想保留哪些数据,因为它必须涉及我所说的 restockID 或让我们选择最新补货的某些字段。【参考方案2】:首先从 items 表中获取 distinct,然后使用它来加入其他表
SELECT items.*, restocks.restockDate, users.userName, users.userLastName, users.userUsername
FROM (SELECT DISTINCT items.itemID, items.itemName, items.itemExistence FROM items) AS items
LEFT JOIN restocks on items.itemID = restocks.itemID
LEFT JOIN users on restocks.userID = users.userID
GROUP BY items.itemName
未测试
【讨论】:
它也有效!但是,正如我在另一个答案中对我的朋友说的那样,您如何通过 desc 订购 restockDate?换句话说,我需要每件商品的最新 restockDate。 尝试将补货的联接更改为 LEFT JOIN (SELECT itemID, restockDate FROM restocks ORDER BY restocksDate DESC) AS restocks ON items.itemID = restocks.itemID 上面的答案建议最好实施,将日期字段格式更改为日期时间 不能再编辑上面的内容了,但我认为这个版本将工作 LEFT JOIN (SELECT itemID, MAX(restockDate) FROM restocks GROUP BY itemID ORDER BY restocksDate DESC) AS restocks ON items.itemID = restocks。 itemID 它将获得按 itemId 分组的日期的最大值以用于连接语句【参考方案3】:更新
select items.itemID, items.itemName, items.itemExistence, restocks.restockDate, users.userName, users.userLastName, users.userUsername
from items
inner join restocks on items.itemID = restocks.itemID
inner join users on restocks.userID = users.userID
GROUP BY items.itemName
【讨论】:
谢谢,这是我之前尝试过的组合之一。它不起作用,因为 itemName 必须不同才能使我有用。【参考方案4】:select
items.itemID, items.itemName, items.itemExistence,
(select A.restockDate from restocks A where A.itemId = items.itemID limit 0, 1),
(select B.userID from restocks B where B.itemId = items.itemID limit 0, 1),
users.userName, users.userLastName, users.userUsername
from items
left join users on B.userID = users.userID
请试试这个。
【讨论】:
有效!有没有办法通过 restockDate DESC 订购?每行显示补货日期,我需要最后一个不同的项目。例如,可口可乐可以补货 N 次。我只需要得到最近的日期。请问?【参考方案5】:你没有提到itemExistence
是什么,所以我希望它是Items
表中的一列。
以下是使用自联接的简单方法:
SELECT i.itemID, i.itemName, i.itemExistence, r1.restockDate,
u.userName, u.userLastName, u.userUsername
FROM Items i
JOIN Restocks r1
ON r1.itemID = i.itemID
JOIN Users u
ON u.userID = r1.userID
LEFT JOIN Restocks r2
ON r2.itemID = i.itemID
AND r2.restockDate > r1.restockDate
WHERE r2.itemID IS NULL
带有WHERE
子句的LEFT JOIN
确保我们只提取具有最新restockDate
的行。
这种方法的优点是它避免了子查询,这通常会否定索引的使用。
如果某件商品在同一日期多次进货,您可能会获得重复记录。
【讨论】:
感谢您的回复。我试过了,但没有用。我只需要显示该项目的唯一 itemName 和 restockDate。 itemExistence 是简单的数学运算:旧库存(例如 6)+ 新库存 (30) = itemExistence (36)。 我在您提供的信息中没有看到old stock
或new stock
。 mysql说,“没用”?我想我们当时就被困住了。
旧货新货是一个php函数。我查找当前库存,然后添加新库存,该操作就是 itemExistence。 MySQL没有说没有用。结果是我不想要的:P。以上是关于在 MySQL 上获取以下内容的查询是啥?的主要内容,如果未能解决你的问题,请参考以下文章