2017-12-27 511 views
0

關係如何獲得與第一

Supplier大部分訂單的供應商列表 - >一對多的關係與orders

| suppliers        | 
| ----------       | 
| id | name | archived (bool) | user_id | 

| orders      | 
| ----------------    | 
| id | supplier_id | creator_id | 

期望

現在,我想名單對於給定的supplier.user_idorders.creator_id以及那個supplier不應該是archived(請在問題最後找到預期結果)。

這裏是我想:

  • 供應商ORDER BY最大(計數(orders.supplier_id))
  • 其中supplier.archived =假
  • 其中supplier.user_id = 2
  • 哪裏orders.creator_id = 1

不成功Attampt

這是我的失敗attampt,我不知道如何在此查詢中添加供應商條件。

select supplier_id, COUNT(*) as count_suppliers 
    from orders 
    where creator_id = 2 
    group by orders.supplier_id 
    order by count_suppliers desc 

因此,這裏是我想要的

suppliers 

| id | user_id | archived | 
| --- | --------- | ------- | 
| 1 | 2   | false | 
| 2 | 2   | false | 
| 3 | 2   | false | 
| 4 | 2   | false | 
| 5 | 2   | true  | 

orders 

| id | creator_id | supplier_id | 
| -- | --------- | ------------ | 
| 1 | 1   | 1   | 
| 2 | 1   | 1   | 
| 3 | 1   | 1   | 
| 4 | 1   | 1   | 
| 5 | 1   | 2   | 
| 6 | 1   | 2   | 
| 7 | 1   | 3   | 
| 8 | 1   | 4   | 
| 9 | 1   | 4   | 
| 10 | 1   | 4   | 
| 11 | 1   | 5   | 

expected output 

| supplier_id | supplier_count | 
| 1   | 4    | 
| 4   | 3    | 
| 2   | 2    | 
| 3   | 1    | 

SOLUTION

所以最後參照Vamsi的答案,在這裏你可以找到包括原始版本的SQL和ActiveRecord的(滑軌)此問題的解決方案版本:

RAW SQL VERSION

SELECT o.supplier_id, COUNT(*) AS count_suppliers 
FROM suppliers s 
JOIN orders o ON s.id=o.supplier_id 
WHERE s.user_id=2 
AND s.archived=FALSE 
AND o.creator_id=2 
GROUP BY o.supplier_id 
ORDER BY count_suppliers DESC 
LIMIT 5 

ActiveRecord (Rails) Version

Supplier 
    .joins(:orders) 
    .where(user_id: 2, archived: false, orders: { creator_id: 2 }) 
    .group("orders.supplier_id") 
    .order("count_all DESC") 
    .limit(limit) 
    .count 
+2

首先弄清楚這RBDMS你使用。然後請參閱https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-查詢 – Strawberry

+0

我錯過了'JOIN'部分。 Vamsi Prabhala的答案爲我工作。 – przbadu

回答

1

可以join表和計數。

select p.supplier_id, COUNT(*) as count_suppliers 
from purchase_orders p 
join suppliers s on s.id=p.supplier_id 
where s.user_id=2 and p.creator_id=1 and s.archived='False' 
group by p.supplier_id 
order by count_suppliers desc 
+0

謝謝,看起來我錯過了加入部分,它像一個魅力。 – przbadu

0
select top 1 supplier_id, COUNT(*) as count_suppliers 
from purchase_orders 
where orders.creator_id = 1 
And supplier.archived = false 
And supplier.user_id = 2 
group by purchase_orders.supplier_id 
order by COUNT(*) desc 
+1

這看起來像一個SQL Server查詢,我認爲這不會在MySQL或PostgreSQL中工作。 –

+0

是的,沒有任何地方的訂單或供應商的參考,你在查詢 – przbadu

+0

缺少'JOIN' Vamsi的答案按預期工作。 – przbadu