用户
+--------+--------------+----------+--------------+
| 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)提示如何帮助我。的承诺。 的
答案 0 :(得分:2)
正如评论中所讨论的,许多补货可以在同一天进行,因此在这种情况下无法比较日期。此处提供了两个选项:使用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
对于第二种情况,重构意味着将日期字段更改为唯一标识记录的唯一日期时间。这是最好的解决方案,但它确实需要更新表中存在的任何先前数据。这意味着,要更新单个产品补货的具有相同日期的所有记录,并为它们设置不同的日期时间。
懒惰的人(像我一样)会选择第一个选项:)如果您对此有任何疑问,请告诉我。
答案 1 :(得分:1)
首先从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
未经测试
答案 2 :(得分:0)
已更新
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
答案 3 :(得分:0)
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
请试一试。
答案 4 :(得分:0)
你没有提到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
带有LEFT JOIN
子句的WHERE
确保我们只使用最新的restockDate
来提取行。
这种方法的优点是它避免了子查询,子查询通常会否定索引的使用。
如果特定商品在同一天重新进货多次,您可以获得重复记录。