2015-02-21 5 views
0

У меня есть этот запрос, где IF линия только частично возвращается правильный результат:Mysql IF геЬигпа вопросы

ЗЕЬЕСТА

COALESCE((SELECT COUNT(ID) FROM USERS_BUCKETS WHERE USERS_BUCKETS.USERID = USERS.ID),0) AS ADDED, 
COALESCE((SELECT SUM(CASE WHEN USERS_BUCKETS.STATUS='Completed' THEN 1 ELSE 0 END) FROM USERS_BUCKETS WHERE USERS_BUCKETS.USERID = USERS.ID),0) AS DONE, 
COALESCE((SELECT COUNT(ID) FROM USERS_LIKES WHERE USERS_LIKES.USERID = USERS.ID),0) AS NUM_LIKES, 
COALESCE((SELECT COUNT(ID) FROM FOLLOW WHERE FOLLOW.USER_ID=USERS.ID),0) AS FOLLOWING, 
COALESCE((SELECT COUNT(ID) FROM FOLLOW WHERE FOLLOW.FOLLOW_ID=USERS.ID),0) AS FOLLOWERS, 

(SELECT IF(ADDED >= 5,1,0)) AS IFADDED, 
(SELECT IF(DONE >= 3,1,0)) AS IFDONE, 
(SELECT IF(NUM_LIKES >= 5,1,0)) AS IFNUM_LIKES, 
(SELECT IF(FOLLOWING >= 5,1,0)) AS IFFOLLOWING, 
(SELECT IF(FOLLOWERS >= 3,1,0)) AS IFFOLLOWERS, 

(SELECT IF(ADDED >= 5,1,0) + IF(DONE >= 3,1,0) + IF(NUM_LIKES >= 5,1,0) + IF(FOLLOWING >= 5,1,0) + IF(FOLLOWERS >= 3,1,0)) AS PROGRESS 

FROM USERS 
WHERE USERS.ID=? 

Результата:

ADDED: 20 
IFADDED: 1 

DONE: 9 
IFDONE: 0 //should be 1 

NUM_LIKES: 11 
IFNUM_LIKES: 1 

FOLLOWING: 11 
IFFOLLOWING: 0 //should be 1 

FOLLOWERS: 10 
IFFOLLOWERS: 0 //should be 1 

PROGRESS: 2 

Что случилось? Все значения IF должны быть равны 1 и PROGRESS должно быть 5. Примечание: Я использую PDO в php, но я не думаю, что это вообще имеет значение.

ответ

0

Я понятия не имею, почему ваш код работает. Столбцы, безусловно, не являются псевдонимами столбцов, определенными ранее в запросе.

Чтобы сделать то, что вы хотите, использовать подзапрос и упростить логику:

SELECT u.*, (ADDED >= 5) AS IFADDED, 
     (DONE >= 3) AS IFDONE, 
     (NUM_LIKES >= 5) AS IFNUM_LIKES, 
     (FOLLOWING >= 5) AS IFFOLLOWING, 
     (FOLLOWERS >= 3) AS IFFOLLOWERS, 
     ((ADDED >= 5) + (DONE >= 3) + (NUM_LIKES >= 5) + (FOLLOWING >= 5) + 
     (FOLLOWERS >= 3) 
     ) AS PROGRESS 
FROM (SELECT COALESCE((SELECT COUNT(ID) FROM USERS_BUCKETS WHERE USERS_BUCKETS.USERID = USERS.ID),0) AS ADDED, 
      COALESCE((SELECT SUM(CASE WHEN USERS_BUCKETS.STATUS='Completed' THEN 1 ELSE 0 END) FROM USERS_BUCKETS WHERE USERS_BUCKETS.USERID = USERS.ID),0) AS DONE, 
      COALESCE((SELECT COUNT(ID) FROM USERS_LIKES WHERE USERS_LIKES.USERID = USERS.ID),0) AS NUM_LIKES, 
      COALESCE((SELECT COUNT(ID) FROM FOLLOW WHERE FOLLOW.USER_ID=USERS.ID),0) AS FOLLOWING, 
      COALESCE((SELECT COUNT(ID) FROM FOLLOW WHERE FOLLOW.FOLLOW_ID=USERS.ID),0) AS FOLLOWERS 
     FROM USERS 
     WHERE USERS.ID = ? 
    ) u; 

Это имеет преимущество в том, что MySQL обрабатывает булевы в виде целых чисел в числовом контексте, с «1» для истинного и " 0 "для false.

EDIT: Следует также отметить, что coalesce() не требуется, потому что count() вернет 0, когда нет совпадений.

+0

Что вы подразумеваете под «Столбцами, определенно, не являются псевдонимы столбцов, определенные ранее в запросе»? – erdomester

+0

@endomester. , , Вы не можете ссылаться на псевдоним столбца в том же 'select', где он определен. Это означает, что столбцы в выражениях 'if()' распознаются как столбцы в 'users'; они не относятся к значениям, определенным ранее в 'select'. –

+0

Спасибо. Ваш код работает, но вы можете разработать большую внутреннюю часть FROM и что такое 'u'? – erdomester

Смежные вопросы