2010-03-20 41 views
18

Ngay bây giờ tôi có truy vấn sau đây:truy vấn mysql: SELECT DISTINCT column1, GROUP BY column2

SELECT name, COUNT(name), time, price, ip, SUM(price) 
    FROM tablename 
WHERE time >= $yesterday 
    AND time <$today GROUP BY name 

Và những gì tôi muốn làm là thêm một DISTINCT theo cột 'ip', tức là

SELECT DISTINCT ip FROM tablename 

Vì vậy, kết quả cuối cùng của tôi sẽ là tất cả các cột, từ tất cả các hàng mà thời gian là ngày hôm nay, được nhóm theo tên (với số lượng tên cho mỗi tên lặp lại) và không có địa chỉ IP trùng lặp.

Truy vấn của tôi trông như thế nào? (Hoặc cách khác, làm thế nào tôi có thể thêm bộ lọc còn thiếu vào đầu ra với php)?

Xin cảm ơn trước.


[UPDATE]

Để giảm thiểu sự nhầm lẫn, xem xét việc này (giản thể) bảng db:

| name | ip | 
--------------------- 
| mark | 123 | 
| mark | 123 | 
| mark | 456 | 
| dave | 789 | 
| dave | 087 | 

Kết quả Tôi đang tìm sẽ được một bảng HTML nhìn như thế này:

| name | name count | 
---------------------------- 
| mark |  2  | 
| dave |  2  | 

Tôi hiện đang nhận được:

| name | name count | 
---------------------------- 
| mark |  3  | 
| dave |  2  | 

(đánh dấu là 3 lần, mặc dù hai lần có cùng một ip).

+0

Tôi cũng đã cố gắng ip DISTINCT CHỌN TỪ (SELECT tên, COUNT (tên), thời gian, giá cả, ip, SUM (giá) TỪ tablename ĐÂU thời gian> = $ ngày hôm qua và thời gian <$ ngày nay GROUP BY name) dưới dạng TABLE Nhưng tôi nhận được lỗi cú pháp ... –

+0

** Thử: ** CHỌN DISTINCT ** TABLE.ip ** FROM (SELECT T.name, COUNT (T.name), T.time , T.price, T.ip, SUM (T.price) TỪ tablename T WHERE time> = $ hôm qua VÀ thời gian <$ today GROUP BY name) dưới dạng TABLE – lexu

+0

- "đối số được cung cấp không phải là tài nguyên kết quả MySQL hợp lệ" :( –

Trả lời

48

bạn có thể sử dụng COUNT(DISTINCT ip), điều này sẽ chỉ đếm giá trị khác biệt

+0

yep, nhưng nó không giải quyết được vấn đề của tôi :) cảm ơn –

+0

Adam: Tại sao điều này không giải quyết được vấn đề của bạn? –

+0

Ôi, đợi một chút. Cố gắng sao chép truy vấn để trả lời câu hỏi Marks tiết lộ: NÀY LÀM VIỆC !!!!! Tôi không thể tin được. Tôi nghĩ tôi có thể khóc. –

3

Bạn chỉ có thể thêm DISTINCT(ip), nhưng nó phải đến lúc bắt đầu truy vấn. Hãy chắc chắn để thoát khỏi các biến PHP đi vào chuỗi SQL.

SELECT DISTINCT(ip), name, COUNT(name) nameCnt, 
time, price, SUM(price) priceSum 
FROM tablename 
WHERE time >= $yesterday AND time <$today 
GROUP BY ip, name 
+0

Đã cố gắng thêm DISTINCT (ip) ngay từ đầu, không hoạt động, nó chỉ bỏ qua nó. Từ 'nameCnt' đến từ đâu? Tôi viết sai truy vấn? (Nó làm việc với tôi w/o 'nameCnt' & 'priceSum' trước đây, ngoại trừ điều DISTINCT) .... –

+0

Tốt hơn nên đặt tên cho các cột để bạn có thể tham khảo chúng bằng bí danh trong PHP thay vì phải sử dụng $ result ['COUNT (name)'] - thay vào đó với bí danh $ result ['nameCnt']. Tôi nghĩ rằng bạn sẽ phải 'GROUP BY ip, name', câu trả lời cập nhật – Andy

+1

Bạn không thể thực sự làm điều đó - khác biệt không phải là một chức năng; đó là từ khóa áp dụng cho toàn bộ hàng hoặc một công cụ sửa đổi trên hàm tổng hợp. Trong trường hợp của bạn, đó là một từ khóa cho SELECT, đó là lý do tại sao nó phải đến trước các tên cột. Dấu ngoặc đơn bạn đặt quanh 'ip' chỉ là trang trí. –

2

Bằng cách nào đó yêu cầu của bạn có vẻ hơi mâu thuẫn ..

nhóm theo tên (mà về cơ bản là một khác biệt về tên cộng sự sẵn sàng để tổng hợp) và sau đó một biệt trên IP

Bạn nghĩ gì nên xảy ra nếu hai người (tên) làm việc từ cùng một IP trong khoảng thời gian được chỉ định?


Bạn đã thử cái này chưa?

SELECT name, COUNT(name), time, price, ip, SUM(price) 
    FROM tablename 
WHERE time >= $yesterday AND time <$today 
GROUP BY name,ip 
+0

Tôi đã thử nó, không nhận được kết quả đúng. Lý do tôi muốn sử dụng DISTINCT trên ip, là tôi không muốn trùng lặp ip. Lý do tôi muốn sử dụng GROUP BY trên tên là vì vậy tôi có thể đếm tên (ví dụ: hiển thị một hàng trong bảng cho tôi biết có bao nhiêu người có tên "đánh dấu" ở đó). Tôi không (và sẽ không) có hai tên trên cùng một IP trong db của tôi. –

+0

Về tên GROUP BY, ip ... Nó không giải quyết được vấn đề, tôi nghĩ rằng nó chỉ nhóm theo cột đầu tiên và bỏ qua thứ hai. –

+0

@Adam: Nó nhóm theo tên và IP .. bạn có thể thấy điều này dễ dàng hơn bằng cách di chuyển IP đến vị trí thứ hai của danh sách chọn. – lexu

13

Thay FROM tablename với FROM (SELECT DISTINCT * FROM tablename) nên cung cấp cho bạn những kết quả mà bạn muốn (bỏ qua hàng nhân đôi) ví dụ:

SELECT name, COUNT(*) 
FROM (SELECT DISTINCT * FROM Table1) AS T1 
GROUP BY name 

Kết quả cho dữ liệu thử nghiệm của bạn:

dave 2 
mark 2 
+0

Nghe hay đấy. Làm cách nào để trích xuất dữ liệu?(Không bao giờ sử dụng SELECT trong một SELECT trước). Bảng 1 có phải là Bảng của tôi không? T1 là gì? Cảm ơn trước –

+1

@Adam: Có, 'Table1' là tên bảng của bạn, trong khi' T1' là bí danh cho truy vấn con đó, vì vậy bạn cũng có thể viết 'SELECT T1.name, ...'. MySQL yêu cầu bí danh cho tất cả các truy vấn con (+1 cho câu trả lời này). –

+0

Cảm ơn Peter và Mark. Làm cách nào để sử dụng dữ liệu trong php của tôi? Tôi đã sử dụng $ data = mysql_query ("SELECT ...") và sau đó trong khi ($ row = mysql_fetch_array ($ data)) {echo $ row ['name']; echo $ row ['COUNT (tên)']; } Nhưng bây giờ nó trả về sản phẩm nào. –

2

Hãy thử như sau:

SELECT DISTINCT(ip), name, COUNT(name) nameCnt, 
time, price, SUM(price) priceSum 
FROM tablename 
WHERE time >= $yesterday AND time <$today 
GROUP BY ip, name 
+0

Các hàm tổng hợp có được phép với các hàm DISTINCT không? –

Các vấn đề liên quan