List:General Discussion« Previous MessageNext Message »
From:Dan Rossi Date:December 28 2005 7:10am
Subject:Re: need help with user variables in where clause of sub query
View as plain text  
I have an unfinished query, i am trying to test, basically im required 
to get the value of the current field in a row and use it for a 
subquery in that row :| Its not a working query, and im not asking for 
someone to fix it, however as u can see i need to send the customerID 
and month to the sub query. What its actually trying to do is tedious 
to explain, but i have two tables of media usage for a customer, the 
current month will be in the usage table, so that if the plan changes 
in that month so does the totals, but for the previous months there is 
a static month_totals table showing just the totals recorded. So im 
needing to select two different tables depending on what month is being 
selected. I hope this helps.

SELECT SQL_CACHE

CASE WHEN MONTH(mt.month) = MONTH(NOW())

THEN

CREATE VIEW current_month AS

SELECT

@customerID:=c.customerID, @month:=fu.month AS month, 
DATE_FORMAT(fu.month,'%M') AS month_long,

@total_bandwidth:=( SELECT SUM(fu.bandwidth) FROM feed_usage fu WHERE 
fu.customerID=@customerID AND fu.month=@month),

@feed_bandwidth:=( SELECT SUM(fu.bandwidth) FROM feed_usage fu WHERE 
fu.customerID=@customerID AND fu.month=@month AND fu.feedID IN (SELECT 
feedID FROM producers_join WHERE producerID IN (3))),

@percentage:=((@feed_bandwidth/@total_bandwidth)) AS percentage,

@month_totals:=(SELECT month_total FROM month_totals WHERE 
customerID=@customerID AND DATE_FORMAT(month,"%m")=@month GROUP BY 
month, customerID) AS month_totals,

@count:=(SELECT count(*) FROM feed_usage WHERE customerID=@customerID 
AND month=@month),

@feed_count:=(SELECT count(*) FROM feed_usage WHERE 
customerID=@customerID AND month=@month AND feedID IN (SELECT feedID 
FROM producers_join WHERE producerID IN (3))),

ROUND(( IF(c.bandwidth_limit=0, 
((c.monthly_price/@count)*f.percentage_paid)*@feed_count, 
((@month_totals*@percentage)*f.percentage_paid) )),0) AS providers_cut

FROM feed_usage fu INNER JOIN customers c ON fu.customerID=c.customerID 
INNER JOIN feeds f ON fu.feedID=f.feedID WHERE f.feedID IN (SELECT 
feedID FROM producers_join WHERE producerID IN (3)) GROUP BY 
fu.month,fu.customerID ORDER BY fu.month DESC

ELSE

CREATE VIEW previous_months AS

SELECT

@customerID:=c.customerID, @month:=MONTH(mt.month) AS month, 
DATE_FORMAT(mt.month,'%M') AS month_long, @feeds:=feeds,

@total_bandwidth:=( SELECT bandwidth FROM month_totals WHERE 
customerID=@customerID AND MONTH(month)=@month),

@feed_bandwidth:=( SELECT bandwidth FROM month_totals INNER JOIN  WHERE 
customerID=@customerID AND fu.month=@month AND fu.feedID IN (SELECT 
feedID FROM producers_join WHERE producerID IN (3))),

@percentage:=((@feed_bandwidth/@total_bandwidth)) AS percentage,

@month_totals:=(SELECT month_total FROM month_totals WHERE 
customerID=@customerID AND DATE_FORMAT(month,"%m")=@month GROUP BY 
month, customerID) AS month_totals,

@count:=(SELECT count(*) FROM feeds WHERE feedID IN (@feeds)),

@feed_count:=(SELECT count(*) FROM month_totals WHERE 
customerID=@customerID AND month=@month AND feedID IN (SELECT feedID 
FROM producers_join WHERE producerID IN (3))),

ROUND(( IF(c.bandwidth_limit=0, 
((c.monthly_price/@count)*f.percentage_paid)*@feed_count, 
((@month_totals*@percentage)*f.percentage_paid) )),0) AS providers_cut

FROM feed_usage fu INNER JOIN customers c ON fu.customerID=c.customerID 
INNER JOIN feeds f ON fu.feedID=f.feedID WHERE f.feedID IN (SELECT 
feedID FROM producers_join WHERE producerID IN (3)) GROUP BY 
fu.month,fu.customerID ORDER BY fu.month DESC

END

On 28/12/2005, at 4:47 PM, SGreen@stripped wrote:

> Dan Rossi <mysql@stripped> wrote on 12/27/2005 11:39:57 PM:
>
>> Hi there i am trying to use usewr variables in a select statement to
>> add to a where clause in a sub query. Ie
>>
>> select @id:=id,@month:=month, (select SUM(totals) from table where
>> id=@id and month=@month) as totals from table
>>
>> its happened on other occasions ie with calculations and sums, whats
>> happened in mysql5 ? It used to work in mysql4 , something i am doing
>> is wrong ? Please let me know thanks.
>>
>>
>
> Is there a great reason why you are using a subquery? I could rewrite 
> this
> to avoid the subquery and probably eliminate your particular problem:
>
> SELECT id, month, sum(totals) totals FROM TABLE group by id, month;
>
> Unless(!) you oversimplified your original example. In which case, you
> should post your actual query and I can give you a better response.
>
> Technically, the values of the variables should not be determined until
> AFTER the row is processed which means that you shouldn't be able to 
> use
> them for your subquery (at least that's how I remember the SQL:2003 
> spec
> but it's late and I could very well be wrong in my recollection)
>
> Personally, I am not that big a fan of subqueries anyway. There are a 
> few
> types of queries where they make the SQL to achieve a result rather
> compact and elegant. However, I have never seen a subquery actually
> outperform a properly constructed linear query. They sometimes match
> linear performance but most often perform worse to much worse.
>
> Shawn Green
> Database Administrator
> Unimin Corporation - Spruce Pine
>
>

Thread
need help with user variables in where clause of sub queryDan Rossi28 Dec
  • Re: need help with user variables in where clause of sub querySGreen28 Dec
    • Re: need help with user variables in where clause of sub queryDan Rossi28 Dec
      • Re: need help with user variables in where clause of sub querySGreen28 Dec
        • Re: need help with user variables in where clause of sub queryDan Rossi29 Dec
        • Re: need help with user variables in where clause of sub queryDan Rossi29 Dec
          • Re: need help with user variables in where clause of sub queryDan Rossi29 Dec
            • Re: need help with user variables in where clause of sub querySGreen29 Dec
              • Re: need help with user variables in where clause of sub queryDan Rossi29 Dec
                • Re: need help with user variables in where clause of sub querySGreen29 Dec