List:General Discussion« Previous MessageNext Message »
From:Dan Rossi Date:December 29 2005 4:31am
Subject:Re: need help with user variables in where clause of sub query
View as plain text  
Btwi dont want the column of a view to be a variable, i think thats 
what it thinks ! Im just needing to send the value of the current 
primary key field top a sub query !

Read my latest post if i can get around not using variables, and still 
manage to get the right values of a current row going to a sub query ?

On 29/12/2005, at 2:48 AM, SGreen@stripped wrote:

>
> You seem to be coming at SQL with a COBOL perspective. Views are 
> something you typically create just once and they stay updated 
> automatically. They work like tables not like queries. Assigning 
> variables to each column of a view doesn't make any sense (in the SQL 
> sense of "view") as each column could potentially contain several 
> million values, depending on how many rows you identify for your VIEW 
> in your definition statement.
>
> You demonstrated your situation with a conditional branch on a value 
> to produce one of two different . What I think you wanted to do was to 
> UNION two queries together so that you could combine the history of a 
> customer's account with the current month's activity into a single set 
> of results.
>
> Your queries are also insensitive to year changes. What happens when 
> you are in Jan 2006 and you need to review the previous month's data?
>
> Since you are using views I know you are on v5.x or higher. However, I 
> think you have become so entangled with your subqueries that you have 
> managed to confuse yourself. Using a subquery to calculate every value 
> of each row is VERY inefficient and unless you are actually trying to 
> prove just how bad it is, I strongly suggest you modify your approach 
> to become more linear, perhaps completely linear.
>
> Here is an example of how to combine two queries into a single result:
>
> (
> SELECT fu.customer_id
>   ,  fu.month
>   , sum(fu.usage) total_bandwidth
>   , sum(if(p.producerID is NULL, 0, fu.usage)) feed_bandwidth
>   , sum(fu.usage)/sum(if(p.producerID is NULL, 0, fu.usage)) percentage
>   , count(distinct f.feedID) count
>   , count(distinct if(p.producerID is null, null, f.feedid) feed_count
> FROM feed_usage fu
> INNER JOIN customers c
>   ON fu.customerID=c.customerID
>  INNER JOIN feeds f
>   ON fu.feedID=f.feedID
> LEFT JOIN producers_join p
>   ON f.feedID = p.feedID
>   AND p.producerID IN (3)
> GROUP BY fu.month,fu.customerID
> )
> UNION
> (
> SELECT customerid
>   ,  month
>   , total_bandwidth
>   , feed_bandwidth
>   , percentage
>   , count
>   , feed_count
> FROM month_totals
> )
> ORDER BY fu.month DESC;
>
> See how I disentangled so many of your subqueries? If you are having 
> speed problems, we can work on that after we get the query working, 
> OK? ALSO(!) you don't refer to a value in the outer query by its 
> variable name (because you normally don't use variables in 
> subqueries), you normally use the actual column name in the subquery.
>
> Shawn Green
>  Database Administrator
>  Unimin Corporation - Spruce Pine
>
>
> Dan Rossi <mysql@stripped> wrote on 12/28/2005 01:10:32 AM:
>
>  > 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