2012-04-08 44 views
8

Tôi có một truy vấn SQL để lại tham gia một bảng theo nhiều cách khác nhau tùy theo điều kiện.Làm cách nào để sử dụng câu lệnh IF trong truy vấn tham gia MySQL?

SELECT m.id, u.first_name AS otherUser 
FROM matches AS m 
IF (u.id=m.user2ID) 
    LEFT JOIN users AS u ON u.id = m.user1ID 
ELSE 
    LEFT JOIN users AS u ON u.id = m.user2ID 
ENDIF 
WHERE m.user1ID=2 OR m.user2ID=2 

matches là bảng có cột số nguyên user1ID và user2ID. users là một bảng chứa người dùng ứng dụng web của tôi. users có trường VARCHAR được gọi là first_name.

Mục đích của truy vấn này là lấy tên của người dùng phù hợp với người dùng hiện tại.

Tuy nhiên, MySQL trả về lỗi này:

#1064 - You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for 
the right syntax to use near 'IF (u.id=m.user2ID) LEFT JOIN users 
AS u ON u.id = m.user1ID ELSE LEFT JOIN user' at line 3 

Tại sao?

Trả lời

0

Bạn không thể sử dụng IF THEN ELSE END IF-stuff trong một SELECT theo cách này. Tuy nhiên, bạn có thể sử dụng nó trong các thủ tục và chức năng được lưu trữ.

Tôi sẽ JOINu.id với cả hai m.user1IDm.user2ID và sử dụng DISTINCT để tránh trùng lặp.

Có một IF() mà bạn có thể sử dụng trong CHỌN, nhưng bạn không thể thực hiện kiểm soát luồng với IF().

3

Sử dụng truy vấn này:

SELECT m.id, u.first_name AS otherUser FROM matches AS m LEFT JOIN users AS u ON u.id = m.user1ID AND u.id=m.user2ID LEFT JOIN users AS u1 ON u1.id = m.user2ID WHERE m.user1ID=2 OR m.user2ID=2

truy vấn Cập nhật:

SELECT m.id, u.first_name AS otherUser 
FROM matches AS m 
LEFT JOIN users AS u ON u.id = (CASE WHEN u.id=m.user2ID 
            THEN m.user1ID 
            ELSE m.user2ID 
           END) 
WHERE m.user1ID=2 OR m.user2ID=2 

Kiểm tra Source này.

Đồng thời kiểm tra điều này MYSQL Inner Join if statement. Nó có thể hữu ích cho bạn.

+0

Cảm ơn, truy vấn này tạo ra số lượng kết quả phù hợp, nhưng trả về NULL một cách kỳ lạ cho tất cả các giá trị trong cột otherUser. Dường như không phát hiện tên đầu tiên của người dùng, như được hiển thị ở đây http://goo.gl/jg7xp –

8

Xác định tình trạng này như một phần của mệnh đề ON:

SELECT m.id, u.first_name AS otherUser 
FROM matches AS m 
LEFT JOIN users AS u ON (u.id=m.user2ID and u.id = m.user1ID) or (u.id<>m.user2ID and u.id = m.user2ID) 
WHERE m.user1ID=2 OR m.user2ID=2 

Một cách khác để làm điều tương tự:

SELECT m.id, u.first_name AS otherUser 
FROM matches AS m 
LEFT JOIN users AS u ON IF(u.id=m.user2ID,u.id = m.user1ID,u.id = m.user2ID) 
WHERE m.user1ID=2 OR m.user2ID=2 
+0

Cảm ơn, hai truy vấn này đang tạo ra số kết quả phù hợp, nhưng trả về NULL một cách kỳ lạ cho tất cả các giá trị trong ' cột Người dùng khác. Dường như không phát hiện tên đầu tiên của người dùng, như được hiển thị ở đây http://goo.gl/jg7xp –

+0

nó là một LEFT OUTER JOIN vì vậy dường như điều kiện không hài lòng đối với bất kỳ hàng nào. Tôi chỉ đơn giản là sao chép dán các điều kiện từ truy vấn ban đầu của bạn. Trên giao diện thứ hai, tôi thấy điều gì đó sai với các điều kiện - u.id <> m.user2ID và u.id = m.user2ID. Bây giờ điều đó sẽ không bao giờ đúng! Các điều kiện khác cũng không chắc mặc dù không phải là không thể. Vui lòng kiểm tra lại các điều kiện của bạn. Chỉ cần sử dụng câu trả lời này làm mẫu và cắm các điều kiện chính xác. – Dojo

+0

Nếu truy vấn hoạt động với các điều kiện đã thay đổi, hãy chỉnh sửa câu trả lời của tôi và thay đổi các điều kiện cho lợi ích của bất kỳ ai xảy ra để đọc nội dung này sau – Dojo

0

Cảm ơn, Nó làm việc cho tôi. Thử cái gì khác như dưới đây:

**

Create table TEMP1 (ID INT,T_MONTH INT,T_YEAR INT) 
INSERT INTO TEMP1 VALUES(1,1,2001) 
INSERT INTO TEMP1 VALUES(2,2,2001) 
INSERT INTO TEMP1 VALUES(3,3,2001) 

**

CREATE TABLE TEMP2 (T_MONTH INT,T_YEAR INT,FREQUENCY CHAR(1),VAL FLOAT) 
INSERT INTO TEMP2 VALUES(1,2001,'M',1.1) 
INSERT INTO TEMP2 VALUES(3,2001,'M',1.2) 
INSERT INTO TEMP2 VALUES(3,2001,'Q',1.3) 
INSERT INTO TEMP2 VALUES(12,2001,'A',1.4) 

SELECT * FROM TEMP1 L JOIN TEMP2 H 
ON L.T_YEAR = H.T_YEAR 
OR (L.T_MONTH = (CASE WHEN H.FREQUENCY='M' 
         THEN H.T_MONTH 
        END) 
    OR dbo.GetQuarterFromMonth(L.T_MONTH) = (CASE WHEN H.FREQUENCY = 'Q' 
         THEN dbo.GetQuarterFromMonth(H.T_MONTH) 
         END)) 
WHERE H.FREQUENCY = 'Q' 

Đây GetQuarterFromMonth là một người dùng định nghĩa Chức năng trả về khu phố cho một tháng cụ thể.

Mục tiêu của truy vấn trên là làm tăng giá trị của Quý cho tất cả các tháng trong bảng 1. Nếu tần suất là hàng năm thì trong trường hợp đó giá trị sẽ được tăng cho tất cả các tháng 1-12 của bảng 1 đạt được thông qua điều kiện tham gia đầu tiên. Trong trường hợp tần suất là Hàng tháng thì mỗi tháng từ bảng 1 phải được ánh xạ tới bảng 2. Trường hợp duy nhất là xử lý tần số quý.

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