2010-01-15 6 views
10

ich zwei MySQL-Tabellen haben - ein Verkaufstisch:Wählen Sie verschiedene Datensätze auf einem Join

+----------------+------------------------------+------+-----+---------+-------+ 
| 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 ein Artikel Tabelle:

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

Der Verkaufstisch für jeweils mehrere Datensätze enthält ItemID - eine für jede SaleWeek. Ich möchte alle Einzelteile durch die Verbindung der beiden Tabellen wie so verkauft wählen:

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

Dies ist jedoch mehrere kehrt ItemId Werte auf der Grundlage der mehrere Einträge für jeden SaleWeek. Kann ich nur eine bestimmte Auswahl tun, um eine Rückkehr ItemID - ich will nicht für die neueste SaleWeek abfragen müssen, weil einige Elemente für die neueste SaleWeek so muss ich die letzte bekommen kann keinen Eintrag Verkauf. Muss ich angeben DISTINCT oder verwenden Sie eine LINKS OUTER JOIN oder etwas?

+1

Haben Sie DISTINCT versucht? Je nachdem, welches DBMS Sie verwenden, kann es Ihre Bestellung vermasseln ... –

Antwort

14

A DISTINCT sollte das tun, was 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; 

dass nur unterschiedliche items.ItemName, items.ItemId Tupel zurückkehren würde.

6

Sie hatten auch einen Kommentar über die Verkaufswoche. Und das letzte Woche wollen, können Sie versuchen, eine GROUP BY mit

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 

Sie haben durch die Reihenfolge zu ändern, um die Ordnungs 3. Spalte Referenz, wenn Sie so auf dieser Spalte wollen .. Diese Abfrage wird geben Sie jedem einzelnen Artikel und der letzten Woche wurde es verkauft.

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