Выбор отдельных записей в соединении
У меня две таблицы mysql - таблица продаж:
+----------------+------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------------------------+------+-----+---------+-------+
| StoreId | bigint(20) unsigned | NO | PRI | NULL | |
| ItemId | bigint(20) unsigned | NO | | NULL | |
| SaleWeek | int(10) unsigned | NO | PRI | NULL | |
+----------------+------------------------------+------+-----+---------+-------+
и таблица элементов:
+--------------------+------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+------------------------------+------+-----+---------+-------+
| ItemId | bigint(20) unsigned | NO | PRI | NULL | |
| ItemName | varchar(100) | NO | | NULL | |
+--------------------+------------------------------+------+-----+---------+-------+
Таблица продаж содержит несколько записей для каждого ItemID - по одному для каждого SaleWeek. Я хочу выбрать все проданные товары, соединяя две таблицы так:
SELECT items.ItemName, items.ItemId FROM items
JOIN sales ON items.ItemId = sales.ItemId
WHERE sales.StoreID = ? ORDER BY sales.SaleWeek DESC;
Однако это возвращает несколько значений ItemId на основе нескольких записей для каждого SaleWeek. Могу ли я сделать отдельный выбор, чтобы возвращать только один ItemID. Я не хочу запрашивать последние SaleWeek, потому что у некоторых элементов может не быть записи для последних SaleWeek, поэтому мне нужно получить последнюю продажу. Нужно ли указывать DISTINCT или использовать LEFT OUTER JOIN или что-то еще?
Ответы
Ответ 1
A DISTINCT
должен делать то, что вы ищете:
SELECT DISTINCT items.ItemName, items.ItemId FROM items
JOIN sales ON items.ItemId = sales.ItemId
WHERE sales.StoreID = ? ORDER BY sales.SaleWeek DESC;
Это вернет только различные кортежи items.ItemName, items.ItemId
.
Ответ 2
У вас тоже был комментарий о торговой неделе. И, желая последнюю неделю, вы можете попробовать использовать GROUP BY
SELECT
items.ItemName,
items.ItemId,
max( Sales.SaleWeek ) MostRecentSaleWeek
FROM
items JOIN sales ON items.ItemId = sales.ItemId
WHERE
sales.StoreID = ?
GROUP BY
items.ItemID,
items.ItemName
ORDER BY
MostRecentSaleWeek, -- ordinal column number 3 via the MAX() call
items.ItemName
Возможно, вам придется изменить ORDER BY на порядковый номер 3-го столбца, если вы этого хотите, на основе этого столбца.. Этот запрос даст вам каждый отдельный элемент и последнюю неделю, когда он был продан.
Ответ 3
SELECT u.user_name,u.user_id, u.user_country,u.user_phone_no,ind.Industry_name,inv.id,u.user_email
FROM invitations inv
LEFT JOIN users u
ON inv.sender_id = u.user_id
LEFT JOIN employee_info ei
ON inv.sender_id=ei.employee_fb_id
LEFT JOIN industries ind
ON ei.industry_id=ind.id
WHERE inv.receiver_id='XXX'
AND inv.invitation_status='0'
AND inv.invitati
on_status_desc='PENDING'
GROUP BY (user_id)