2015-08-24 3 views
0

В настоящее время я работаю над опросник стиле веб-сайт, где кто-то может создать анкету, а затем либо ответить на него, как человек, который создал его или пригласить людей на него ответить.MySQL Left присоединяется непредвиденного вывода

В настоящее время у меня возникают проблемы при попытке использовать соединения.

  • Когда кто-то отвечает в качестве администратора, но они не пригласили в свою questionniare я получаю ошибки показано ниже.
  • Когда кто-то не отвечает как администратор, но я пытаюсь запустить запрос, я, похоже, получаю тот же ответ.

tl; dr: Я пытаюсь вернуть две строки с информацией. Как questionniare администратора, который не приглашен на опросника

 
SELECT cat.catID, cat.catName, cat.catPerms, cat.projectNumber, 
     CASE 
      WHEN cat.catID IS NOT NULL AND count(ANS.itemID) = 0 THEN "Awaiting Response" 
      WHEN count(ANS.itemID) > 0 THEN "Responded" 
     END AS "status" 
    FROM categories AS cat 
    INNER JOIN invited AS invtee ON cat.catID = invtee.catID 
    INNER JOIN answers AS ANS ON cat.catID = ANS.catID 
     WHERE invtee.invEmail = "[email protected]" 

UNION ALL 

SELECT cat.catID, cat.catName, cat.catPerms, cat.projectNumber, 
     CASE 
      WHEN count(ANS.itemID) = 0 THEN "Awaiting Response" 
      WHEN count(ANS.itemID) > 0 THEN "Responded" 
     END AS "status" 
    FROM categories AS cat 
    LEFT OUTER JOIN answers AS ANS ON cat.catID = ANS.catID AND ANS.userEmail = "[email protected]" 
     WHERE cat.adminEmail = "[email protected]"; 

Таблицы, которые имеют отношение к запросу ...

categories:

 
| catID | catName | adminName | adminEmail | catDate | catPerms | projectNumber | 
+-------+---------+-----------+------------+---------+----------+---------------+ 
| 1  | Stack | Stack ... | [email protected] | ...  | 0  | ...   | 
| 2  | Over | Stack ... | [email protected] | ...  | 0  | ...   | 

invited (имел в виду должно быть пустым):

 
| invID | catID | invName | invEmail | 
+-------+-------+---------+----------+ 
|  |  |   |   | 

answers:

 
| answerID | catID | itemID | choiceID | userName | userEmail | answerText | answerStatus | 
+----------+-------+--------+----------+----------+-----------+------------+--------------+ 
| 1  | 1  | 1  | 2  | Stack... | [email protected] | ...  | 1   | 

Выход:

 
| catID | catName | catPerms | projectNumber | Status | 
+-------+---------+----------+---------------+-----------+ 
| 1  | Over | 0  | ...   | Responded | 
| NULL | NULL | NULL  | NULL   | NULL  | 

Что бы быть лучшим способом решить эту проблему?

Редактировать: Внутри этого утверждения кажется, что left outer join игнорируется.

 
SELECT cat.catID, cat.catName, cat.catPerms, cat.projectNumber, 
     CASE 
      WHEN count(ANS.itemID) = 0 THEN "Awaiting Response" 
      WHEN count(ANS.itemID) > 0 THEN "Responded" 
     END AS "status" 
    FROM categories AS cat 
    LEFT OUTER JOIN answers AS ANS ON cat.catID = ANS.catID AND ANS.userEmail = "[email protected]" 
     WHERE cat.adminEmail = "[email protected]"; 
+0

вы имеете в виду, чтобы избежать строки с NULL значениями? – Regenschein

+0

@Regenschein, я даже не знаю, на данный момент - я только что был взломан на этот сайт с помощью этого случайного запроса, пытающегося вернуть две строки, даже если администратор не приглашен или не ответил. – Comms

ответ

0

Вы можете использовать having пункт

SELECT * FROM (SELECT cat.catID, cat.catName, cat.catPerms, cat.projectNumber, 
     CASE 
      WHEN cat.catID IS NOT NULL AND COUNT(ANS.itemID) = 0 THEN "Awaiting Response" 
      WHEN COUNT(ANS.itemID) > 0 THEN "Responded" 
     END AS STATUS 
    FROM categories AS cat 
    INNER JOIN invited AS invtee ON cat.catID = invtee.catID 
    INNER JOIN answers AS ANS ON cat.catID = ANS.catID 
     WHERE invtee.invEmail = "[email protected]" AND cat.catID IS NOT NULL AND cat.catID >0 

UNION ALL 

SELECT cat.catID, cat.catName, cat.catPerms, cat.projectNumber, 
     CASE 
      WHEN COUNT(ANS.itemID) = 0 THEN "Awaiting Response" 
      WHEN COUNT(ANS.itemID) > 0 THEN "Responded" 
     END AS STATUS 
    FROM categories AS cat 
    LEFT OUTER JOIN answers AS ANS ON cat.catID = ANS.catID AND ANS.userEmail = "[email protected]" 
     WHERE cat.adminEmail = "[email protected]" AND cat.catID >0 
)AS T HAVING T.status IS NOT NULL 
Смежные вопросы