这是我的数据库: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行
答案 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