在MySQL上获取以下内容的查询是什么?

时间:2012-02-29 05:00:12

标签: mysql sql join view

用户

+--------+--------------+----------+--------------+
| 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)提示如何帮助我。的承诺。

5 个答案:

答案 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来提取行。

这种方法的优点是它避免了子查询,子查询通常会否定索引的使用。

如果特定商品在同一天重新进货多次,您可以获得重复记录。