it-swarm.com.de

Wählen Sie bestimmte Datensätze in einem Join aus

Ich habe zwei MySQL-Tabellen - eine Verkaufstabelle:

+----------------+------------------------------+------+-----+---------+-------+
| 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    |       |
+----------------+------------------------------+------+-----+---------+-------+

und eine Artikeltabelle:

+--------------------+------------------------------+------+-----+---------+-------+
| Field              | Type                         | Null | Key | Default | Extra |
+--------------------+------------------------------+------+-----+---------+-------+
| ItemId             | bigint(20) unsigned          | NO   | PRI | NULL    |       |
| ItemName           | varchar(100)                 | NO   |     | NULL    |       |
+--------------------+------------------------------+------+-----+---------+-------+

Die Verkaufstabelle enthält mehrere Datensätze für jede ItemID - einen für jede SaleWeek . Ich möchte alle verkauften Artikel auswählen, indem ich die beiden Tabellen wie folgt verbinde:

SELECT items.ItemName, items.ItemId FROM items
JOIN sales ON items.ItemId = sales.ItemId 
WHERE sales.StoreID = ? ORDER BY sales.SaleWeek DESC;

Dies gibt jedoch mehrere ItemId - Werte basierend auf den mehreren Einträgen für jedes SaleWeek zurück. Kann ich eine bestimmte Auswahl treffen, um nur eine ItemID - zurückzugeben? Ich möchte nicht nach der neuesten SaleWeek fragen müssen, da einige Artikel möglicherweise keinen Eintrag für die neueste SaleWeek haben Ich muss den letzten Verkauf bekommen. Muss ichDISTINCTangeben oder LEFT OUTER JOIN verwenden?

11
George

Eine DISTINCT sollte das tun, wonach Sie suchen:

SELECT DISTINCT items.ItemName, items.ItemId FROM items
JOIN sales ON items.ItemId = sales.ItemId 
WHERE sales.StoreID = ? ORDER BY sales.SaleWeek DESC;

Das würde nur eindeutige items.ItemName, items.ItemId-Tupel zurückgeben.

18
Kaleb Brasee

Sie hatten auch einen Kommentar zur Verkaufswoche. In der letzten Woche möchten Sie möglicherweise versuchen, GROUP BY zu verwenden

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

Möglicherweise müssen Sie ORDER BY in die Ordnungszahl für die 3. Spalte ändern, wenn Sie dies basierend auf dieser Spalte wünschen. Diese Abfrage gibt Ihnen jeden einzelnen Artikel UND die letzte Woche, in der er verkauft wurde.

8
DRapp
    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)
0

Das können wir nutzen:

INSERT INTO `test_table` (`id`, `name`) SELECT DISTINCT 
    a.`employee_id`,b.`first_name` FROM `employee_leave_details`as a INNER JOIN 
    `employee_register` as b ON a.`employee_id` = b.`employee_id`
0
sivaprakash