mmm LEFT JOIN

8 отговора 387 прегледа
#1

mmm LEFT JOIN

М така. Нещо ми е мъка да го направя това..
Имам 2 таблици (иде реч за MySQL)i:

table givenanswers
-------------------------
id
question_id
answer_id
-------------------------

table answers
----------------------
id
question_id
----------------------

В givenanswers се записват дадени отговори на определен въпрос (question_id) които се избират с радио бутони, а в таблица answers са възможните отговори. Искам да селецтна колко отговорили има на всеки възможен отговор. Проста заявка с WHERE не върши работа, защото това ми дава само тези отговори от ансверс таблицата, които имат вече посочили ги хора. Обаче на мене ми трябва да посоча всички възможни отговори, и ако за някои от тях няма посочили го, то просто да напиша 0, но не да го пропусна от извеждането.

Стигнах до това:

SELECT COUNT(tGA.answer_id) as voted, tA.answer as answer FROM pr_answers tA LEFT JOIN pr_givenanswers tGA ON tA.question_id WHERE tGA.question_id=22 AND tGA.question_id=tA.question_id GROUP BY tA.id
и то работи добре само дето за COUNT(tGA.id) ми дава навсякъде наи-високия резултат, т.е. еднакъв навсякъде . Някакви идеи?

Не че не мога да цикля през отговорите и да проверявам за всеки, ама е адски дърводелско.

--
1000 кредита за всеки участник подарък -
Отговор
в отговор на voyager #2

Re: mmm LEFT JOIN

Я вземи та си сложи и tA.id в SELECT частта та да се ориентираш какво става.



това което си написал е:
SELECT a, COUNT(*) .... GROUP BY x

salle.online.bg/sig
Отговор
в отговор на salle #3

Re: mmm LEFT JOIN

м, мерси, ще пробвам ако съм те разбрал правилно де

--
1000 кредита за всеки участник подарък -
Отговор
в отговор на voyager #4

Re: mmm LEFT JOIN

sto ne probvash s outer join...
bi trqbvalo problemat da se reshi...

Отговор
в отговор на outer join #5

Re: :)

Ей тъй що не земеш да пробваш пък може пък нещо да се промени....

Като даваш този акъл защо поне не провериш за какво точно говориш.

OUTER е "излишна" думичка по стандарт. Синтаксиса (според ANSI не само според MySQL) е

LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN

или с други думи това което voyager вече беше изплозвал - LEFT JOIN си е вид OUTER JOIN

salle.online.bg/sig
Отговор
в отговор на voyager #6

Re: mmm LEFT JOIN

Ми така както си го написал питаш колко са избрали даден ансвер_ид, независимо на кой въпрос. Трябва да групираш по двете колони (question_id, answer_id) за да има смисъл:

select question_id, answer_id, count(*)

from ....както и го написал

group by question_id, answer_id

Отговор
в отговор на Бaй Любo #7

Re: mmm LEFT JOIN

Мерси и на salle и на баи Любо за помощта. Обач сега разбрах какво се оказа - като voted- t.e. COUNT(tGA.id) то ми дава броя общо на отговорите за даден въпрос. И това ми излиза еднакво естествено на всеки ред от резултата. На практика по question_id няма нужда да се групира, застото тя заявката ми е ограничена до 1 question. Проблема е, че е необходимо нещо такова :
WHERE tGA.answer_id=tA.id и тогава работи перфектно . Обаче сложа ли го, ако за някои answer все още няма посочвания, тои не присъства в краиния резултат. Нали уж е left join мама му стара... Не трябва ли да ми изведе всички колони от лявата таблица?

Аз сега ще го направя по дърводелския начин и ще работи. Но много ще се радвам ако някои даде по-доброто решение с една заявка.

--
1000 кредита за всеки участник подарък -
Отговор
в отговор на voyager #8

Re: mmm LEFT JOIN

Да бе да -- няма нужда от гроуп бай по въпрос -- не видях че филтрираш по въпрос 22.

Номера е че това tGA.answer_id=tA.id трябва да го плеснеш не в WHERE клаузата, а в джойн клаузата.

Иначе става боза за разбиране щото слагаш хем анси хем не-анси джойн в една заявка и явно и бд-то се обърква -- вероятно прави външен джойн по кво беше там и обикновен джойн по ансвер=ид.

Между другото събасе с която работя не разрешава такива двусмислици -- казва че не можеш да правиш външен по едно поле и вътрешен по друго.

Отговор
в отговор на voyager #9

Re: mmm LEFT JOIN

SELECT COUNT(tGA.answer_id) as voted, tA.answer as answer
FROM pr_answers tA
LEFT JOIN pr_givenanswers tGA ON tA.question_id = tGA.question_id
WHERE tA.question_id=22
GROUP BY tA.id

Отговор