在内部连接(在同一个表上)之后执行左连接和第二个表之后的条件(Mysql)

时间:2015-04-28 14:21:28

标签: php mysql join

这是我的数据库:bott_no_mgmt_data

random_no ; company_id ; bottle_no ; date       ; returned ; returned_to_stock ; username
    30201 ; MY COMP    ;         1 ; 2015-04-28 ;       10 ; NULL              ; ANDREW
    30202 ; MY COMP    ;         2 ; 2015-04-28 ;       10 ; NULL              ; ANDREW
    30205 ; MY COMP    ;         5 ; 2015-04-28 ;       10 ; NULL              ; ANDREW
    30208 ; MY COMP    ;         8 ; 2015-04-28 ;       10 ; NULL              ; ANDREW
    30209 ; MY COMP    ;         9 ; 2015-04-28 ;       10 ; NULL              ; ANDREW
    30210 ; MY COMP    ;        10 ; 2015-04-28 ;       10 ; NULL              ; ANDREW
    30211 ; MY COMP    ;         1 ; 2015-04-29 ;       20 ; NULL              ; ANDREW
    30212 ; MY COMP    ;         2 ; 2015-04-29 ;       20 ; NULL              ; ANDREW
    30213 ; MY COMP    ;         9 ; 2015-04-29 ;       30 ; NULL              ; ANDREW
    30214 ; MY COMP    ;        10 ; 2015-04-29 ;       30 ; NULL              ; ANDREW

我已成功提取bott_no_mgmt_data的所有唯一行,其中字段random_no最高,bottle_no是唯一的,代码如下:

select yt.* 
  from bott_no_mgmt_data yt<br>
       inner join(select bottle_no, max(random_no) random_no
                    from bott_no_mgmt_data 
                   WHERE username = 'ANDREW' 
                   group by bottle_no) ss on yt.bottle_no = ss.bottle_no 
                                         and yt.random_no = ss.random_no  
where returned < 15 and date > '2015-04-01'

例如,它返回的行之一将是

30214;MY COMP;10;2015-04-29;30;NULL;ANDREW 

而不是

30210;MY COMP;10;2015-04-28;10;NULL;ANDREW

因为虽然他们的瓶子是相同的,但前者的random_no更高。

我的问题:

我现在希望比较每个返回的行&#39; bottleno&#39;用另一张表&#39;样品&#39;其中只包含字段&amp; bothno&#39;带有瓶号列表。我希望比较它们,只返回匹配的那些。我假设我们会接受“JOFT JOIN&#39;上面的结果与数据库&#39;样本&#39;如下:

select yt.* from bott_no_mgmt_data yt<br>
       inner join(select bottle_no, max(random_no) random_no
                    from bott_no_mgmt_data WHERE username = 'ANDREW' 
                   group by bottle_no) ss on yt.bottle_no = ss.bottle_no and yt.random_no = ss.random_no 
 where returned < 15 and date > '2015-04-01'
       LEFT JOIN sample ON sample.bottleno = yt.bottle_no

额外的左连接给我一个错误

  

1064 - 您的SQL语法出错;查看与您的MySQL服务器版本对应的手册,以获得正确的语法,以便使用&#39; LEFT JOIN示例ON sample.bottleno = yt.bottleno WHERE sample.bottleno IS NULL&#39;在第7行

2 个答案:

答案 0 :(得分:0)

所有联接都应该在Daan提到的Where子句之前编写:

select yt.* from bott_no_mgmt_data yt
inner join(
    select bottle_no, max(random_no) random_no 
    from bott_no_mgmt_data 
    WHERE username = 'ANDREW' group by bottle_no
)
ss on yt.bottle_no = ss.bottle_no and yt.random_no = ss.random_no 
LEFT JOIN sample ON sample.bottleno = yt.bottle_no
where returned < 15 and date > '2015-04-01'

答案 1 :(得分:-1)

有几件事。你根本不需要第一个内部联接,这是毫无意义的。另外,你说“我希望比较它们,只返回匹配的那些。” - 这意味着你想要INNER JOIN而不是LEFT JOIN。

SELECT MAX(random_no) AS random_no, company_id, yt.bottle_no, `date`, returned, username
FROM bott_no_mgmt_data yt
INNER JOIN sample ON sample.bottle_no=yt.bottle_no
WHERE yt.username = 'ANDREW' 
  AND yt.returned < 15 
  AND yt.date > '2015-04-01'
GROUP BY company_id, yt.bottle_no, `date`, returned, username