2016-08-09 34 views
0

Ich habe zwei Tabellen: shop_item (Eltern) und shop_products (Kinder). In der Tabelle shop_products gibt es die Spalte shop_item_id, die angibt, was seine Eltern sind. Manche Eltern haben viele Kinder. In der Tabelle shop_products befindet sich auch die Spalte shop_number, die eindeutig ist. Mein Ziel ist es, alle Eltern mit Kindern beginnend mit 123 (zum Beispiel) zu finden. Ich kann es von achive:Get Gesamtzahl der Datensätze von Kindern in SQL

SELECT shop_products.shop_number, shop_products.shop_item_id, shop_item.* 
FROM shop_products, 
    shop_item 
WHERE shop_products.shop_number LIKE '123%' 
    AND shop_item.id = shop_products.shop_item_id; 

Dieser funktioniert, aber ich möchte auch einige dieser Kinder bekommen (weil als Folge ich Eltern bekommen), aber ich weiß nicht, ob es überhaupt möglich ist.

EDIT:

Beispiel Tabelle shop_item:

+----+-------+-----+ 
| id | name | ... | 
+----+-------+-----+ 
| 1 | test1 | ... | 
| 2 | test2 | ... | 
| 3 | test3 | ... | 
| 4 | test4 | ... | 
+----+-------+-----+ 

Beispiel Tabelle shop_products:

+----+--------------+-------------+-----+ 
| id | shop_item_id | shop_number | ... | 
+----+--------------+-------------+-----+ 
| 1 | 1   | 12345  | ... | 
| 2 | 2   | 1234567  | ... | 
| 3 | 1   | 14486  | ... | 
| 4 | 3   | 32333  | ... | 
| 5 | 1   | 12399  | ... | 
| 6 | 4   | 12325  | ... | 
| 7 | 2   | 25511  | ... | 
| 8 | 1   | 42387  | ... | 
+----+--------------+-------------+-----+ 

erwartend Ergebnis:

+----+----------+-----+ 
| id | children | ... | 
+----+----------+-----+ 
| 1 | 2  | ... | 
| 2 | 1  | ... | 
| 4 | 1  | ... | 
+----+----------+-----+ 
+2

Fügen Sie eine Beispieltabelle und das erwartete Ergebnis hinzu (gerade genug, um das Problem zu beschreiben). – jarlh

+0

@jarlh siehe bearbeiten. – debute

Antwort

0

Zuerst lernen Sie, die richtige, explizite Syntax join zu verwenden. Einfache Regel: Nie Kommas in der FROM Klausel verwenden. Immer verwenden Sie JOIN.

Dann ist die Antwort auf Ihre Frage GROUP BY. So finden die Eltern

SELECT s.shop_number, COUNT(*) 
FROM shop_products p JOIN 
    shop_item i 
    ON p.shop_number LIKE '123%' AND 
     i.id = p.shop_item_id 
GROUP BY s.shop_number; 

Wenn Sie die Original-Detaildaten mit der Säule gegeben, dann eine korrelierte Unterabfrage verwenden:

SELECT s.shop_number, si.*, 
     (SELECT COUNT(*) FROM shop_item si2 WHERE si2.id = p.shop_item_id) as cnt 
FROM shop_products p JOIN 
    shop_item i 
    ON p.shop_number LIKE '123%' AND 
     i.id = p.shop_item_id; 
0

Sie können dies versuchen, wenn Sie nur die gemeinsame bekommen benötigt Artikel (dh nur die Kinder, die Eltern und die Eltern hat, die Kinder hat):

select shop_products.shop_number, shop_products.shop_item_id, 
     shop_item.*, Count(shop_products.shop_item_id) over (partition by shop_products.shop_item_id) as ChildrenCount 
from shop_item 
inner join shop_products 
on shop_products.shop_item_id = shop_item.shop_item_id 
where shop_products.shop_number LIKE '123%' 

sonst, wenn Sie möchten die Daten unabhängig von der gemeinsamen Nutzung Left Outer Join:

select shop_products.shop_number, shop_products.shop_item_id, 
    shop_item.*, Count(shop_products.shop_item_id) over (partition by shop_products.shop_item_id) as ChildrenCount 
from shop_item 
left outer join shop_products 
on shop_products.shop_item_id = shop_item.shop_item_id 
where shop_products.shop_number LIKE '123%'