2011-07-19 38 views
40

Tôi muốn chọn các giá trị khác biệt trong cơ sở dữ liệu. Để tôi chạy qua một ví dụ nhanh.MYSQL chọn giá trị DISTINCT ở hai cột

Bảng:

foo bar 
--- --- 
a c 
c f 
d a 
c a 
f c 
a c 
d a 
a c 
c a 
f c 

Đúng vậy, chúng ta hãy nói SQL của tôi là SELECT DISTINCT foo, bar from table. Đây là kết quả của tôi:

foo bar 
--- --- 
a c 
c f 
d a 
c a 
f c 

Tuy nhiên vấn đề là là có lặp lại của a c/c a chỉ rằng họ đang ở trong một thứ tự khác nhau. Tôi không muốn chọn những thứ này, tôi muốn các giá trị khác biệt từ cả hai cột, vui lòng trợ giúp!

+2

Đây có phải là một câu hỏi mà bạn đã được yêu cầu trong một số cuộc phỏng vấn. : P –

+0

Không upvoting câu hỏi này là câu trả lời được chọn là làm tôi sợ –

Trả lời

36

rất rất độc ác & ác:

select distinct 
    least(foo, bar) as value1 
    , greatest(foo, bar) as value2 
from table 
+4

Yêu cầu này là điều ác. foo có thể ở giá trị 1 cũng như trong value2. (Chỉ cần kiểm tra nó) – UnstableFractal

+0

Không hoạt động đúng cách. Lựa chọn đầu tiên của tôi đã trả về một bộ dữ liệu như '(5, 108)' - số thứ hai sẽ lớn đến mức sai, tôi phải kiểm tra bản ghi đã thực sự ở đó. Tôi chạy một lựa chọn và nó đã không được. – Buffalo

7

Làm thế nào về:

SELECT DISTINCT a.foo,a.bar FROM table a 
LEFT JOIN table b ON a.foo=b.bar and a.bar=b.foo 
WHERE b.foo IS NULL AND b.bar IS NULL 
+0

@KevinBurton 'foo' và' bar' trong mệnh đề 'WHERE' là mơ hồ –

1
SELECT DISTINCT foo, bar FROM table WHERE 
CONCAT(',',foo,bar,) NOT IN (SELECT CONCAT(',',bar,foo) FROM table) 
3

Bạn đang yêu cầu cho một cái gì đó là đối diện của một đóng cửa đối xứng (Tôi không biết nếu nó có một cái tên đặc biệt, một cái gì đó không đối xứng, vì nó không phải là một đóng cửa). Đối với các bao đóng và đóng cửa giống như những thứ bạn cần so sánh hai cột khác nhau, bạn có thể sử dụng các phép nối. Để đảm bảo bạn không lọc cả hai hàng khi chúng được sao chép qua các cột, bạn cần phải phân biệt các lần lặp lại và bao gồm một trong số các hàng đó, chẳng hạn như bằng cách bao gồm cặp nơi đầu tiên là số thấp hơn.

SELECT DISTINCT t1.foo, t1.bar 
    FROM `table` t1 
    LEFT JOIN `table` t2 
     ON t1.foo=t2.bar AND t1.bar=t2.foo 
    WHERE t2.foo IS NULL OR t1.foo <= t1.bar; 
+0

Tôi đang cố gắng làm điều gì đó tương tự như OP. Có một liên kết đến một hướng dẫn và giải thích tốt có sẵn không? Vì chúng tôi không chắc chắn về thuật ngữ tôi đang đấu tranh để xác định vị trí trên mạng. – djskinner

3
SELECT 
     foo, bar 
    FROM tableX 
    WHERE foo <= bar 
UNION 
    SELECT 
     bar, foo 
    FROM tableX 
    WHERE bar < foo 
61

Làm thế nào về việc sử dụng GROUP BY?

SELECT foo,bar FROM my_table GROUP BY foo,bar

+2

Đây là giải pháp tốt hơn! – Dominique

+2

Hoàn toàn là một câu trả lời tốt hơn nhiều. –

+0

Câu trả lời này phải đúng. –

1

này làm việc cho tôi:

SELECT DISTINCT 
LEAST(sub.foo, sub.bar) as value_1 
, GREATEST(sub.foo, sub.bar) as value_2 

FROM 
(SELECT 
a.foo 
,a.bar 
FROM 
table a 
JOIN 
table b 
on a.foo = b.bar 
and a.bar = b.foo) sub 
Các vấn đề liên quan