2017-11-24 3 views
2

Ich habe Mysql (mysql Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1), und ich schreibe eine solche Abfrage:Mysql: Wie mache ich eine Tabelle in einer Unterabfrage sichtbar?

SELECT 
    (SELECT count(*) 
    FROM items 
    WHERE items.shop_id = shops.id), 
    (SELECT sum(click) 
    FROM items 
    WHERE items.shop_id = shops.id), 
    (SELECT sum(view) 
    FROM items 
    WHERE items.shop_id = shops.id) 
FROM shops 

Es ist gut funktioniert einfach. Aber heute treffe ich ein Problem, das eine SQL so braucht:

SELECT 
    (SELECT count(*) 
    FROM items 
    WHERE items.shop_id = shops.id), 
    (SELECT sum(click) 
    FROM items 
    WHERE items.shop_id = shops.id), 
    (SELECT sum(view) 
    FROM items 
    WHERE items.shop_id = shops.id), 
    (
    SELECT sum(count) 
    FROM (
      SELECT 
      max(id), 
      sum(view) AS 'count' 
      FROM items 
      WHERE items.shop_id = shops.id 
      GROUP BY items.cat_id) a 
) 
FROM shops 

Mysql gibt Unknown column 'shops.id' in 'where clause'. Also meine Frage:

  1. Warum shops.id sichtbar ist in Unterabfrage mit einer Tiefe wie (SELECT sum(click) FROM items WHERE items.shop_id = shops.id), aber nicht sichtbar, wenn auf eine Unterabfrage mit zwei Tiefen kommt?

  2. Gibt es eine Möglichkeit, shops.id in einer Abfragetiefe zwei sichtbar zu machen?

+0

versuchen hinzufügen 'als' zu den Geschäften 'von den Geschäften als sh', und ändern Sie 'Geschäfte' in allen subqery zu 'sh' –

+0

@ АлексейМокрев Funktioniert nicht. – Sayakiss

+0

Wenn eine der folgenden Antworten Ihr Problem gelöst oder Ihnen geholfen hat, markieren Sie es bitte als Antwort und/oder verbessern Sie die Antwort. –

Antwort

0

Sie können Ihre Anfrage so umschreiben unten

SELECT s.*, 
COUNT(i.shop_id) total_count, 
SUM(i.`view`) total_views, 
SUM(i.click) total_clicks, 
COALESCE(c.group_sum,0) group_sum 
FROM shops s 
JOIN items i ON i.shop_id = s.id 
LEFT JOIN (
    SELECT a.shop_id,SUM(a.count) group_sum 
    FROM (
      SELECT shop_id,cat_id,MAX(id),SUM(`view`) AS `count` 
      FROM items   
      GROUP BY shop_id,cat_id 
    ) a 
) c ON s.id = c.shop_id 
GROUP BY s.id 
1

Nun, ich bin kein Experte auf diesem, aber ich werde es von meinem besten Verständnis erklären.

Es können zwei Arten von Unterabfragen sein: 1) korrelierte und (2) Unkorrelierte

Nehmen wir ein Beispiel aus Ihrer Frage nehmen:

SELECT 
    (SELECT count(*) 
    FROM items 
    WHERE items.shop_id = 1) 
from shops; 

In obigen Abfrage, die Unterabfrage verwendet nur die Felder der Tabelle, die in From Klausel nur dieser Unterabfrage definiert ist. Dies ist das Beispiel der unkorrelierten Unterabfrage. Jetzt

, mal sehen, Ihre eigentliche Abfrage:

SELECT 
    (SELECT count(*) 
    FROM items 
    WHERE items.shop_id = shops.id) 
from shops; 

Hier Unterabfrage verwendet shops.id, die nicht Teil der Tabellen in Unterabfrage zu definieren ist.

Eine Unterabfrage (oder innere SELECT-Anweisung) ist korreliert, wenn der von ihr erzeugte Wert von einem Wert abhängt, der von der äußeren SELECT-Anweisung erzeugt wird, die sie enthält.

Hier ist der äußere Teil der Unterabfrage die Tabelle shops, die für die Unterabfrage sichtbar ist. Jetzt

, gehen wir zur eigentlichen Frage:

select 
(
    SELECT sum(count) 
    FROM (
      SELECT 
      max(id), 
      sum(view) AS 'count' 
      FROM items 
      WHERE items.shop_id = shops.id 
      GROUP BY items.cat_id) a 
) 
FROM shops; 

Hier subquery ist selbst innerhalb From Klausel. From clause wird verwendet, um die Tabelle abzurufen, in der die verschiedenen Operationen ausgeführt werden. Aber hier From Klausel selbst abhängig von der äußeren Auswahl, was nicht der Fall sein sollte.

Daher ist shops.id in der letzten Unterabfrage nicht sichtbar.

Ich hoffe, dass dies einen Sinn für Sie machen.

+0

Gibt es eine Möglichkeit, eine Tabelle in einer unkorrelierten Tabelle sichtbar zu machen? – Sayakiss

+0

Können Sie bitte Tabellenschema mit einigen Beispieldaten und den Ergebnissen, die Sie anzeigen möchten, bereitstellen? Das wird wirklich hilfreich sein, um dein Problem zu lösen. –

0

Sie können Ansicht erstellen und verwenden in subquery

create view group_count (shop_id,id,count) as 
(
SELECT 
      shop_id as 'shop_id', 
      max(id) AS 'id', 
      sum(view) AS 'count' 
FROM items 
GROUP BY items.shop_id,items.cat_id 
) 

http://sqlfiddle.com/#!9/6fc2962/1/0

Verwandte Themen