mmm LEFT JOIN
8 отговора
387 прегледа
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 кредита за всеки участник подарък -
Имам 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 кредита за всеки участник подарък -
Re: mmm LEFT JOIN
Я вземи та си сложи и tA.id в SELECT частта та да се ориентираш какво става.
това което си написал е:
SELECT a, COUNT(*) .... GROUP BY x
salle.online.bg/sig
това което си написал е:
SELECT a, COUNT(*) .... GROUP BY x
salle.online.bg/sig
Re: mmm LEFT JOIN
м, мерси, ще пробвам ако съм те разбрал правилно де 
--
1000 кредита за всеки участник подарък -
--
1000 кредита за всеки участник подарък -
Re: mmm LEFT JOIN
sto ne probvash s outer join...
bi trqbvalo problemat da se reshi...
bi trqbvalo problemat da se reshi...
Re: :)
Ей тъй що не земеш да пробваш пък може пък нещо да се промени....
Като даваш този акъл защо поне не провериш за какво точно говориш.
OUTER е "излишна" думичка по стандарт. Синтаксиса (според ANSI не само според MySQL) е
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
или с други думи това което voyager вече беше изплозвал - LEFT JOIN си е вид OUTER JOIN
salle.online.bg/sig
Като даваш този акъл защо поне не провериш за какво точно говориш.
OUTER е "излишна" думичка по стандарт. Синтаксиса (според ANSI не само според MySQL) е
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
или с други думи това което voyager вече беше изплозвал - LEFT JOIN си е вид OUTER JOIN
salle.online.bg/sig
Re: mmm LEFT JOIN
Ми така както си го написал питаш колко са избрали даден ансвер_ид, независимо на кой въпрос. Трябва да групираш по двете колони (question_id, answer_id) за да има смисъл:
select question_id, answer_id, count(*)
from ....както и го написал
group by question_id, answer_id
select question_id, answer_id, count(*)
from ....както и го написал
group by question_id, answer_id
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 кредита за всеки участник подарък -
WHERE tGA.answer_id=tA.id и тогава работи перфектно . Обаче сложа ли го, ако за някои answer все още няма посочвания, тои не присъства в краиния резултат. Нали уж е left join мама му стара... Не трябва ли да ми изведе всички колони от лявата таблица?
Аз сега ще го направя по дърводелския начин и ще работи. Но много ще се радвам ако някои даде по-доброто решение с една заявка.
--
1000 кредита за всеки участник подарък -
Re: mmm LEFT JOIN
Да бе да -- няма нужда от гроуп бай по въпрос -- не видях че филтрираш по въпрос 22.
Номера е че това tGA.answer_id=tA.id трябва да го плеснеш не в WHERE клаузата, а в джойн клаузата.
Иначе става боза за разбиране щото слагаш хем анси хем не-анси джойн в една заявка и явно и бд-то се обърква -- вероятно прави външен джойн по кво беше там и обикновен джойн по ансвер=ид.
Между другото събасе с която работя не разрешава такива двусмислици -- казва че не можеш да правиш външен по едно поле и вътрешен по друго.
Номера е че това tGA.answer_id=tA.id трябва да го плеснеш не в WHERE клаузата, а в джойн клаузата.
Иначе става боза за разбиране щото слагаш хем анси хем не-анси джойн в една заявка и явно и бд-то се обърква -- вероятно прави външен джойн по кво беше там и обикновен джойн по ансвер=ид.
Между другото събасе с която работя не разрешава такива двусмислици -- казва че не можеш да правиш външен по едно поле и вътрешен по друго.
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
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