简体   繁体   中英

MySQL loop and multiple LEFT joins

I got the following code:

SELECT 
      COALESCE(rv.views, 0) as views
   FROM 
      ( select 0 as n 
        union all select 1 
        union all select 2 
        union all select 3 ) n 
        LEFT JOIN restaurant_views rv 
           on rv.date = date_add("2015-02-24", interval - n.n day) 
           and restaurant_id = 192

在此处输入图片说明

This code is giving me the amount of views a restaurant had the last 4 days.
I am looking for a similar query to get the amount of likes a restaurant had the last 4 days.

This is what I got so far:

SELECT 
      ( COUNT( DISTINCT a.restaurant_id) 
      + COUNT( DISTINCT d.restaurant_id)) as num_likes
   FROM 
      ( select 0 as n 
        union all select 1 
        union all select 2 
        union all select 3 ) n 
         LEFT JOIN apple_likes a 
            on a.vote_date = date_add("2015-02-24", interval - n.n day) 
            and a.restaurant_id = 192
         LEFT JOIN android_likes d 
            on d.vote_date = date_add("2015-02-24", interval - n.n day) 
            and d.restaurant_id = 192

And here is the output, which is as you can see not what I'm looking for:
在此处输入图片说明

What do I have to change to get the number of likes in the last query?
(I have checked that the restaurant has likes on all days, so I am positive it's something wrong with the query)

Try this one:

SELECT 
      ( a.likes) 
      + d.likes) as num_likes
   FROM 
      ( select 0 as n 
        union all select 1 
        union all select 2 
        union all select 3 ) n 
         LEFT JOIN (
            SELECT vote_date,COUNT(*) as likes 
            FROM apple_likes
            WHERE restaurant_id = 192
            GROUP BY restaurant_id, vote_date
         ) as a 
            on a.vote_date = date_add("2015-02-24", interval - n.n day) 
         LEFT JOIN (
            SELECT vote_date, COUNT(*) as likes 
            FROM android_likes 
            WHERE restaurant_id = 192
            GROUP BY restaurant_id, vote_date
         ) as d 
            on d.vote_date = date_add("2015-02-24", interval - n.n day) 

I can think of a couple items that might be what you are encountering...

  1. Just because somebody VIEWS a restaurant, does that mean they actually VOTED??? And if Voted, are the only two devices that of apple or android? What if viewing from a browser and they are on a Windows machine browser-based?

  2. Date Equality. In the restaurant views table, is the date field ALWAYS that of a time = 12:00:00 (ie: midnight/morning of the day). If the time-stamps of the votes are anything other than 12:00:00, and you are trying to compare for a date = date + time is probably failing. What you may need is a comparison of the date( vote_date ) = date( date_add( ... )) so this way BOTH are ignoring the time component... Now, that being said, a function on a date column is not going to be optimized, even if the restaurant ID is numeric and part of the index key... it would be PARTIALLY optimized. You may want to just add a generic date of AND vote_date >= '2015-02-20' so it can optimize the restaurant and date, then apply the DATE( vote_date ) for the actual qualfying of records.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM