Re: Complicated query
From: Jerry Stuckle <jstucklex_at_attglobal.net>
Date: Sat, 06 Dec 2014 10:55:55 -0500
Message-ID: <m5v8tm$5oj$1_at_dont-email.me>
>> 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 10:55:55 -0500
Message-ID: <m5v8tm$5oj$1_at_dont-email.me>
On 12/6/2014 9:16 AM, 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. >
Shelly,
Unfortunately, this uses recursive SQL, which MySQL doesn't support. However, you should be able to do it with the GROUP_CONCAT function in MySQL - see the manual.
I don't have time right now to work the entire query out (wife is pushing me to go shopping :) ), but I can take a look at it later today when we get back.
BTW - I have never found it faster to run multiple queries from a C program than let MySQL do it itself. This is especially true if you're using a remote server. The fact a complex query takes so long is a sure indication of a design issue.
-- ================== Remove the "x" from my email address Jerry Stuckle jstucklex_at_attglobal.net ==================Received on Sat Dec 06 2014 - 16:55:55 CET