Какой запрос, чтобы получить следующее на MySQL? - PullRequest
2 голосов
/ 29 февраля 2012

Пользователи

+--------+--------------+----------+--------------+
| 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 USD (Paypal) тому, кто может помочь мне в этом.Promise.

Ответы [ 5 ]

2 голосов
/ 29 февраля 2012

Как обсуждалось в комментариях, многие пополнения запасов могут быть выполнены в один и тот же день, поэтому сравнение данных в этом случае невозможно.Здесь представлены два варианта: использовать добавочный PK из таблицы restocks или реструктурировать таблицу.В первом случае это решение:

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 голос
/ 29 февраля 2012

сначала получите таблицу отличных от предметов, а затем используйте ее, чтобы присоединиться к другим

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

Не проверено

0 голосов
/ 01 марта 2012

Вы не упоминаете, что такое 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.

Преимущество этого подхода состоит в том, что он избегает подзапросов, которые часто сводят на нет использование индексов.

Вы можете получить дубликаты записей для определенного элемента, если он был пополнен более одного раза в одну и ту же дату.

0 голосов
/ 29 февраля 2012
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

Пожалуйста, попробуйте это.

0 голосов
/ 29 февраля 2012

ОБНОВЛЕНО

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...