2014-01-31 2 views
-1

Моей моделью 1 вино может быть много бутылок. Эти бутылки имеют поле output_type NULL или NOT NULL.SQLite count в левом запросе соединения

На самом деле, я могу рассчитывать бутылки, как это:

SELECT COUNT(DISTINCT(bottles.id)) AS total_bottles 
FROM wines 
LEFT JOIN bottles ON wines.id = bottles.wine_id AND bottles.status=1 AND bottles.output_type IS NULL 

Это хорошо работает.

Но теперь мне нужно больше: я хочу считать, что бутылки хранятся (output_type NULL) И подсчитывают, что бутылки ушли (output_type NOT NULL) в том же запросе.

Так что мой ЛЕВЫЙ ПРИСОЕДИНЕНИЕ недостаточно, потому что я не могу считать бутылки хранящимися и бутылки ушли в основной запрос.

Я видел что-то подобное, в том числе «к югу от запроса» в LEFT JOIN:

LEFT JOIN (SELECT count(*) AS bottle_stored FROM bottles WHERE bottles.status=1 AND bottles.output_type IS NULL) AS total_stored ON wines.id = bottles.wine_id 

Но это не работает. Если это работает, я могу дублировать LEFT JOIN, чтобы пересчитать оставшиеся бутылки.

EDIT: Дополнительные пояснения здесь. Это мой текущий запрос. Я могу считать все бутылки хранящимися (output_type IS NULL) для каждого вина.

SELECT wines.id, wines.winery 
COUNT(DISTINCT(bottles.id)) AS total_bottles 
FROM wines 
LEFT JOIN bottles ON wines.id = bottles.wine_id AND bottles.status=1 AND bottles.output_type IS NULL 
WHERE wines.status = 1 
GROUP BY wines.id 

EDIT 2 (DB схемы добавляется):

wines table 
----------- 
id (vc) 
winery (vc) 
name (vc) 
status (int) 
... 

bottles table 
------------- 
id (vc) 
wine_id (vc) 
input_type (int) 
input_date (datetime) 
output_type (int) 
output_date (datetime) 
status (int) 
... 

Я хочу:

  • перечислить все вина
  • для подсчета бутылок, хранящихся (output_type NULL) для каждого вина список
  • , чтобы считать бутылку упущенной (output_type NOT NULL) для каждого вина в списке

в этом же запросе.

Мои первичные и внешние ключи являются varchar, потому что это UUID (глобальная система синхронизации).

+0

Нет ли отсутствующей ГРУППЫ? –

+0

Да, я добавил. ;) –

ответ

3

Попробуйте это:

SELECT COUNT(DISTINCT(bottles.id)) AS bottles_stored, 
     (SELECT COUNT(DISTINCT(bottles.id)) AS total_bottles 
      FROM wines 
      LEFT JOIN bottles ON wines.id = bottles.wine_id AND bottles.status = 1) - COUNT(DISTINCT(bottles.id)) AS bottles_gone 
    FROM wines 
    LEFT JOIN bottles ON wines.id = bottles.wine_id AND bottles.status = 1 AND bottles.output_type IS NULL 
  1. Выберите все бутылки, которые хранятся => бутылки.output_type = NULL
  2. подзапросов для подсчета общего количества бутылок
  3. Вычесть bottles_stored из total_bottles => бутылок, которые ушли

UPDATE ПОСЛЕ ВТОРОЙ редактируют muqaddar:

Во-первых, запрос чтобы перечислить все вина (1):

SELECT w.id, 
     w.name, 
     w.winery 
    FROM wines 

Далее мы подсчитываем все хранящиеся бутылки (2) и бутылки ле ушел (2) для конкретного вина ID = 1:

SELECT COUNT(b.id) 
    FROM bottles AS b 
WHERE b.output_type IS NULL AND 
     b.wine_id = 1 

и

SELECT COUNT(b.id) 
    FROM bottles AS b 
WHERE b.output_type IS NOT NULL AND 
     b.wine_id = 1 

В качестве третьего шага мы объединяем всех трех запросов с запросом (2) и (3), как подзапросы и мы заменяем статический id = 1 на w.id из внешнего запроса:

SELECT w.id, 
     w.name, 
     w.winery, 
     (SELECT COUNT(b.id) 
      FROM bottles AS b 
     WHERE b.output_type IS NULL AND 
       b.wine_id = w.id) AS bottles_stored, 
     (SELECT COUNT(b.id) 
      FROM bottles AS b 
     WHERE b.output_type IS NOT NULL AND 
       b.wine_id = w.id) AS bottles_gone 
    FROM wines 
+0

Извините, но это, кажется, считает, что все бутылки исчезли для каждого вина и добавили их в результате. У меня нет ушедших бутылок для каждого вина. –

+0

Затем вы должны предоставить нам более подробную информацию о проблеме и, возможно, некоторый код или дизайн базы данных для ваших таблиц. –

+0

У меня есть мой вопрос. –

Смежные вопросы