Re: Complicated query
From: The Natural Philosopher <tnp_at_invalid.invalid>
Date: Sat, 06 Dec 2014 16:49:21 +0000
Message-ID: <m5vc2i$jbq$6_at_news.albasani.net>
>>>> I have finally come across a desired query that I have no idea on
>>>> how to
>>>> do -- or if it is even possible. Here is the scenario:
>>>>
>>>> Table Instances
>>>> ===============
>>>> id
>>>> column1
>>>> column2
>>>> (and more)
>>>>
>>>> Table Questions
>>>> ===============
>>>> Id
>>>> Question Text
>>>>
>>>> Table Answers
>>>> =============
>>>> Id
>>>> QuestionId (Id in Questions)
>>>> InstanceId (Id in Instances)
>>>>
>>>> Table Questions has Q entries. (Lets say just three for now.) What I
>>>> want is to pull where each record contains:
>>>>
>>>> Table Instances has N entries.
>>>>
>>>> Table Answers has Q x N entries.
>>>>
>>>> I want to pull N records where each record has:
>>>> column1, column2, Answer1, Answer2, Answer3
>>>>
>>>> In other words, I want all the answers (Q of them) for a given instance
>>>> to be in a single returned record, not one answer in each of Q records
>>>> returned.
>>>>
Date: Sat, 06 Dec 2014 16:49:21 +0000
Message-ID: <m5vc2i$jbq$6_at_news.albasani.net>
On 06/12/14 15:46, Luuk wrote:
> On 6-12-2014 15:45, The Natural Philosopher wrote: >> On 06/12/14 14:16, Shelly wrote: >>> On 12/6/2014 8:28 AM, Shelly wrote:
>>>> I have finally come across a desired query that I have no idea on
>>>> how to
>>>> do -- or if it is even possible. Here is the scenario:
>>>>
>>>> Table Instances
>>>> ===============
>>>> id
>>>> column1
>>>> column2
>>>> (and more)
>>>>
>>>> Table Questions
>>>> ===============
>>>> Id
>>>> Question Text
>>>>
>>>> Table Answers
>>>> =============
>>>> Id
>>>> QuestionId (Id in Questions)
>>>> InstanceId (Id in Instances)
>>>>
>>>> Table Questions has Q entries. (Lets say just three for now.) What I
>>>> want is to pull where each record contains:
>>>>
>>>> Table Instances has N entries.
>>>>
>>>> Table Answers has Q x N entries.
>>>>
>>>> I want to pull N records where each record has:
>>>> column1, column2, Answer1, Answer2, Answer3
>>>>
>>>> In other words, I want all the answers (Q of them) for a given instance
>>>> to be in a single returned record, not one answer in each of Q records
>>>> returned.
>>>>
>>> >>> After some research I found a good solution on the net. (Note: I >>> inadvertently left out that the Answers table has a column "Answer" when >>> I posed the original question). >>> >>> This is for Oracle. The solution is: >>> >>> with data >>> as >>> ( >>> select I.*, A.answer, row_number() over (partition by >>> observation_card_id order by answer) rn, >>> count(*) over (partition by A.InstanceId) cnt >>> from Answers A >>> join Instances I on (I.ID = A.InstanceId) >>> order by A.QUESTION_ID >>> ) >>> select D.*, ltrim(sys_connect_by_path(D.Answer,','),',') Answers >>> from data D >>> where rn = cnt >>> start with rn = 1 >>> connect by prior D.Id = D.Id and prior rn = rn-1 >>> order by D.Id >>> >>> The answers are all in one field, Answeers, and it is a comma separated >>> string. >>> >>> Thank you to Joe Stefanelli who answered someone else about this on >>> stackoverflow.com. >>> >> This is the sort of query where I have found that doing it all in >> application software using multiple queries is quicker, for sub zillion >> records, than expecting mysql to do it in hours.. >> >> For < zillion records, buy oracle and a very powerful computer... >> >> Don't get me wrong. I love mysql. But it is not best when optimising and >> executing complex queries. And its not nearly as good at it as a custom >> program written in (e.g.) C, is. >> >> >> > > The query is not complex.
Any subquery is complex for mysql, or at least dog slow.
> The database is....
>
in my case large, but very simple. One big table of 20 fields
> Can you define 'Instance'? is that the item that someone starts to > answer questions? > > Can you define 'Answers'? Are those the possible answers (multiple > choice) for a question? or the given answers in this instance. > > This 'complex' problem has nothing to do with mysql being 'less' able > to do this kind of questions.
-- Everything you read in newspapers is absolutely true, except for the rare story of which you happen to have first-hand knowledge. – Erwin KnollReceived on Sat Dec 06 2014 - 17:49:21 CET