2010-01-15 11 views
10

İki MySQL tablolar - bir satış tablosu:bir katılmak

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

ve ürün tablosu: Satış tabloda her ItemID için birden fazla kayıt içeren

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

- Her bir SaleWeek için bir tane. Öyle gibi iki tablo birleştirme tarafından satılan tüm öğeleri seçmek istiyorum:

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

Ancak bu her SaleWeek için birden girdileri dayalı birden ItemId değerlerini dönüyor. Sadece bir tanesini ItemID dönmek için ayrı bir seçme yapabilir - Bazı öğeler son SaleWeek için bir giriş olmayabilir çünkü son SaleWeek sorgulamak zorunda kalmak istemiyoruz yüzden son almak gerekir satış. DISTINCT belirtmem mi veya SOL DIŞI JOIN veya başka bir şey mi kullanmalıyım?

+1

DISTINCT'i denediniz mi? Kullanmakta olduğunuz DBMS'ye bağlı olarak siparişinizi mahvedebilir ... –

cevap

14

A DISTINCT aradığınız yapmalı: Sadece farklı items.ItemName, items.ItemId dizilerini döneceğini

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

.

6

YOu satış haftası hakkında da yorum yapmıştım. Ve en son hafta isteyen, lütfen bunu o sütun dayalı olarak istediğiniz takdirde sıralı 3 sütun referansına TARAFINDAN SİPARİŞ değiştirmeniz gerekebilir

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 

GROUP BY kullanarak deneyebilirsiniz .. Bu sorgu olacak Size her bir ayrı ürünü ve satıldığı en son hafta verin.

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) 
İlgili konular