2012-01-25 52 views
5

Tôi cố gắng sắp xếp cơ sở dữ liệu mysql tham chiếu hai cột theo thứ tự bảng chữ cái mà company_name là loại chính nhưng nếu không có company_name thì sắp xếp theo last_name. Tôi sẽ liệt kê một ví dụ bên dưới.MYSQL - Sắp xếp 2 cột Theo thứ tự abc, sử dụng cột thứ hai nếu cột đầu tiên là

COMPANY_NAME: (loại cột chính)
1 ABC Vận tải
2 Genius ấm
4 Xtreme của Windows

last_name: (cột thứ cấp)
1 Bryant
2 Rogers
3 Flint
4 Lewis

Sắp xếp như thế này:
1 ABC Vận tải
3 Flint
2 Genius ấm
4 Xtreme của Windows

Đây có phải là thậm chí có thể hoặc nên tôi chỉ cần hợp nhất các thành một mảng và sắp xếp chúng bằng php?

Trả lời

6

Chỉ cần chọn một cột làm 'tên' bằng cách sử dụng trường hợp và thứ tự của nó. Tốt nhất được hiển thị bằng ví dụ.

SELECT 
CASE WHEN company_name IS NULL THEN last_name ELSE company_name END AS name 
FROM mytable 
ORDER BY name ASC 

Nếu bạn thực sự muốn, bạn cũng có thể sử dụng mệnh đề đúng theo thứ tự theo mệnh đề.
Tôi nghĩ rằng ở trên thực sự là một giải pháp tốt hơn cho vấn đề của bạn bởi vì bạn không còn có logic trong php, nhưng bạn có thể không đồng ý.

SELECT company_name, last_name 
FROM mytable 
ORDER BY CASE WHEN company_name IS NULL THEN last_name ELSE company_name END ASC 

CHỈNH SỬA: Tôi chỉ giả định company_name IS NULL là đúng cho trường hợp của bạn. Nếu bạn cần phải làm điều này trên một điều kiện khác nhau thì đó là bạn đang tập thể dục riêng. Nó có rỗng không? hoặc nên so sánh nó với '' thay thế?

+0

Can công việc CASE khi lĩnh vực trống và không null? –

+0

Tôi có thể quay trở lại và làm cho trường rỗng nếu rỗng hoặc tôi có thể đánh giá nó là ''. Ngay bây giờ trường không trống rỗng. –

+0

Điều kiện cũng giống như nếu bạn định sử dụng nó trong mệnh đề 'where'. 'select * từ tablename, nơi company_name = ''', Nếu điều đó cho bạn tất cả các hàng có trống company_names thì bạn sẽ muốn sử dụng 'company_name = ''' làm điều kiện. – user606723

1

Vay từ người dùng606723 câu trả lời, nhưng cho biết cách thực hiện điều này thường được thực hiện trong MySQL, sử dụng IFNULL().

IFNULL() trả về biểu thức đầu tiên, ngoại trừ khi biểu thức đầu tiên là rỗng, nó sẽ trả về biểu thức thứ hai. Nó được thiết kế cho các loại kịch bản này.

SELECT 
    IFNULL(company_name, last_name) AS name 
FROM mytable 
ORDER BY name 

Sửa

Nếu COMPANY_NAME giữ khoảng trống thay vì null, sau đó bạn có thể làm điều này:

SELECT 
    IF(company_name <> '', company_name, last_name) AS name 
FROM mytable 
ORDER BY name 

Với một tuyên bố IF, nếu biểu thức đầu tiên để đánh giá đúng, sau đó nó trả về biểu thức thứ hai, ngược lại, nó trả về biểu thức thứ ba.

Nếu bạn có thể có NULL hoặc trống, thì điều này sẽ làm việc:

SELECT 
    IF(company_name IS NOT NULL AND company_name <> '', company_name, last_name) AS name 
FROM mytable 
ORDER BY name 
+0

Cả hai ví dụ của bạn và 606723 gần như làm việc. Tôi cảm thấy như im thiếu một cái gì đó nhỏ. đầu ra trông như thế này Sắp xếp như sau: 1 Xe tải ABC 2 Hệ thống sưởi thiên tài 4 Xtreme Windows thiếu hàng chỉ có họ. –

+0

Ah, nó không phải là NULL sau đó, nó là trống. Bạn có thể sử dụng câu lệnh IF cho điều đó. Tôi đang cập nhật câu trả lời ngay bây giờ. –

+1

Có thực sự bất kỳ lợi thế để một tuyên bố IF (hoặc là nó thực sự là một chức năng) như thế này? Tôi cảm thấy như các tuyên bố trường hợp là chính xác hơn. Tôi thành thật thấy điều này là thực hành tồi, nhưng có lẽ tôi không biết gì về điều gì đó. – user606723

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