2012-02-29 37 views
10

Tôi có một bảng "tbl" mà trông như thế này:Chọn dòng phù hợp đầu tiên

prod | cust | qty 
p1 | c1 | 5 
p1 | c2 | 10 
p2 | c1 | 2 
p3 | c2 | 8 

Những gì tôi cần là một danh sách riêng biệt của cặp sản phẩm và khách hàng nhưng chỉ có khách hàng đầu tiên nếu sản phẩm được bán cho nhiều hơn một khách hàng. Theo thứ tự các kết quả cần phải trông như thế này:

prod | cust 
p1 | c1 
p2 | c1 
p3 | c2 

Tôi đã thử cách này theo cách mà tôi có thể nghĩ nhưng tôi không thể có được kết quả chính xác. Rõ ràng là không phân biệt và nhóm nào sẽ hoạt động (riêng của chúng) vì chúng sẽ trả về hàng p1, c2.

Tôi tìm thấy điều này question là một kết quả rất gần nhưng tôi không thể tìm ra cách viết lại nó để làm cho nó làm những gì tôi cần.

Đầu tiên tất cả điều này hiện cần phải hoạt động trong Access 2007 trở lên nhưng tại một số điểm tương lai, nó cũng sẽ cần phải hoạt động trong MySQL.

Tín dụng bổ sung cho bất kỳ ai cũng tham gia kết quả vào bảng khách hàng để tôi có thể tra cứu tên người có thể đọc được từ mã khách hàng, ví dụ: c1 => Trình soạn thảo Fred Bloggs

+1

Làm cách nào để xác định "khách hàng đầu tiên"? Có một lĩnh vực ngày mà làm cho rằng rõ ràng rằng bạn không hiển thị? –

+0

Tôi định nghĩa "đầu tiên" sẽ được trả về bởi truy vấn - tôi sẽ hài lòng với p1, c1 hoặc p1, c2 được trả lại Tôi chỉ không thể đối phó với cả hai được trả về (vì mã sản phẩm đang được sử dụng trong tham gia khác và tôi không muốn trùng lặp). Không có các trường hữu ích khác trong bảng tbl. – wobblycogs

+1

OK, tôi đọc nhận xét này sau khi đăng câu trả lời - điều này không có ý nghĩa - bạn muốn khách hàng "đầu tiên", nhưng bạn thực sự không quan tâm đến khách hàng "đầu tiên" là ai hoặc họ được xác định như thế nào? Tôi không viết yêu cầu của bạn, nhưng bạn thực sự muốn kết quả ngẫu nhiên về cơ bản theo thời gian?!? –

Trả lời

13

Lõi Câu hỏi:

SELECT prod, MIN(cust) 
FROM yourTable 
GROUP BY prod 

Đối với "Bonus":

SELECT T.prod, 
     T.cust, 
     YC.SomeCustomerAttribute1, 
     YC.SomeCustomerAttribute2 
FROM (
     SELECT prod, MIN(cust) AS first_cust 
     FROM yourProducts 
     GROUP BY prod 
) AS T 
JOIN yourCustomers AS YC ON YC.cust = T.first_cust 
+1

+1 Mặc dù tôi bắt đầu nghi ngờ rằng OP chỉ muốn 'CHỌN DISTINCT prod TỪ bảng' – Fionnuala

+0

Rất cám ơn câu trả lời, tại chỗ về những gì tôi muốn. Nó không bao giờ xảy ra với tôi để sử dụng min. – wobblycogs

1

nếu bạn chỉ muốn kết quả đầu tiên thêm LIMIT 1 vào truy vấn của mình hoặc sử dụng SELECT DISTINCT để nhận kết quả duy nhất.

như đối với bạn tham gia kiểm tra này:

SELECT * FROM TableA 
INNER JOIN TableB 
ON TableA.name = TableB.name 

này sẽ nhận được tất cả các hàng với một phù hợp với name từ tableA và TableB.

EDIT J Cooper đúng, quyền truy cập ms không tương đương với LIMIT. gần nhất là TOP nhưng tôi không nghĩ điều đó sẽ hữu ích. xin lỗi, không sử dụng quyền truy cập từ đại học.

+0

Tôi không muốn _just_ hàng đầu tiên. Tôi cũng muốn các hàng p2, c1 và p3, c2. Giới hạn sẽ gây ra chỉ p1, c1 được trả về. – wobblycogs

+2

Tôi chắc chắn rằng truy cập ms không hỗ trợ 'LIMIT'. –

2

tôi sẽ phải thừa nhận rằng bạn có một số loại định danh cho biết là người "đầu tiên". Cột ngày hoặc cột nhận dạng hoặc thứ gì đó.

Trong ví dụ của tôi, tôi đã thực hiện nó với cột xác định order_id.

CREATE TABLE products (
    order_id MEDIUMINT NOT NULL AUTO_INCREMENT, 
    prod char(2), 
    cust char(2), 
    qty int, 
    PRIMARY KEY (order_id) 
); 

INSERT INTO products (prod, cust, qty) VALUES 
    ('p1', 'c1', 5), 
    ('p1', 'c2', 10), 
    ('p2', 'c1', 2), 
    ('p3', 'c2', 8); 

Và sau đó để có được giá trị của bạn chạy:

select p1.prod, p1.cust, p1.qty 
from products p1 
where not exists (select * from products p2 
       where p1.prod = p2.prod 
       and p2.order_id < p1.order_id) 

nơi trên mỗi dòng bạn kiểm tra xem nếu có bất kỳ khách hàng khác mà ra lệnh cho nó sớm hơn bạn đã làm. Nếu có lệnh trước đó, thì đừng liệt kê hàng này. (Do đó, not exists)

Đây là cú pháp mysql, btw, mà bạn nói bạn đang di chuyển đến. (Các chuyên gia truy cập sẽ phải chỉnh sửa điều này một cách thích hợp.)

Bây giờ, nếu bạn không có cột xác định những gì chỉ định trình tự khi các đơn đặt hàng được nhập, bạn cần một.Bất kỳ kế hoạch nào dựa vào hàng đợi ngầm định dựa trên thứ tự chèn sẽ sụp đổ cuối cùng, vì "hàng đầu tiên" không được bảo đảm để giữ nguyên.

+0

Theo như tôi biết MS Access không hỗ trợ 'exist' –

+0

MS Access hỗ trợ' exist'. – HansUp

+0

Bạn có thể đúng về truy cập - Tôi sử dụng nhiều DB, nhưng không truy cập, mà tôi cho là ANSI, nhưng rõ ràng là không. Nên đã đặt vòng loại cao hơn về mysql (mà ông nói rằng ông cần cuối cùng). Tôi vẫn sẽ nhấn mạnh thảo luận của tôi rằng để làm bất cứ điều gì thực sự anh ta cần một số loại định danh chuỗi/datetime. Nhưng vì anh ta chỉ muốn một kết quả ngẫu nhiên, sau đó bất cứ điều gì. . . –

0

"Đầu tiên" và min() không giống nhau. Nếu bạn thực sự muốn trước tiên, hãy thử điều này:

declare @source table 
(
    prod varchar(10), 
    cust varchar(10), 
    qty int 
) 

insert into @source (prod, cust, qty) values ('p1', 'c1', 5) 
insert into @source (prod, cust, qty) values ('p1', 'c2', 10) 
insert into @source (prod, cust, qty) values ('p2', 'c1', 2) 
insert into @source (prod, cust, qty) values ('p3', 'c2', 8) 

select * from @source 

declare @target table 
(
    prod varchar(10), 
    cust varchar(10), 
    qty int 
) 

insert into @target (prod) 
select distinct prod from @source 

update @target 
set 
    cust = s.cust, 
    qty = s.qty 
from @source s 
join @target t on t.prod = s.prod 

select * from @target 
Các vấn đề liên quan