2015-04-07 2 views
3

Я пытаюсь использовать оператор IN, чтобы получить количество определенных полей в таблице.Как получить счет с помощью оператора `IN`

Это мой запрос:

SELECT order_id, COUNT(*) 
FROM remake_error_type 
WHERE order_id IN (1, 2, 100) 
GROUP BY order_id; 

Мой выходной ток:

| order_id | COUNT(*) | 
+----------+----------+ 
| 1  | 8  | 
| 2  | 8  | 

Мой ожидаемый выход:

| order_id | COUNT(*) | 
+----------+----------+ 
| 1  | 8  | 
| 2  | 8  | 
| 100 | 0  | 
+0

Числа я добавил в операторе я.e (1,2,100) является, например, только динамическим, то есть может быть более трех чисел. – stack2

+0

Является ли 'order_id' внешним ключом? –

+0

Да order_id - это внешний ключ – stack2

ответ

2

Вы можете написать свой запрос так:

SELECT t.id, COUNT(remake_error_type.order_id) 
FROM 
    (SELECT 1 AS id UNION ALL SELECT 2 UNION ALL SELECT 100) as t 
    LEFT JOIN remake_error_type 
    ON t.id = remake_error_type.order_id 
GROUP BY 
    t.id 

a LEFT JOIN будет возвращать все строки из подзапроса слева, а COUNT(remake_error_type.order_id) будет считать все значения, в которых соединение будет успешным.

+0

Число, которое я добавил в операторе, т. Е. (1,2,100), например, является динамическим, т. Е. Может быть более трех чисел – stack2

0

Для этого вы можете использовать союз. Нет, это не использует оператор IN, но это альтернатива, которая даст вам ожидаемые результаты. Одним из вариантов является жестко кодировать ORDER_ID и использовать условное агрегацию, чтобы получить SUM() строк с этим идентификатором:

SELECT 1 AS order_id, SUM(order_id = 1) AS numOrders FROM myTable 
UNION ALL 
SELECT 2 AS order_id, SUM(order_id = 2) AS numOrders FROM myTable 
UNION ALL 
SELECT 100 AS order_id, SUM(order_id = 100) AS numOrders FROM myTable; 

Ниже приведен пример SQL Fiddle.

+0

Число, которое я добавил в оператор, т. Е. (1,2,100) например, это динамический, т. е. может быть более трех чисел – stack2

+0

Итак, что вы переходите в запрос? массив? – AdamMc331

+0

Не массив, я буду передавать более 100 номеров, также у меня нет разрешения на создание или удаление временной таблицы. – stack2

1

Вы можете создать временную таблицу, вставить как можно больше order_ids и выполнить left join в remake_error_type. При небольшом количестве заказов другие ответы достаточны, но если вы делали это для большого количества заказов, UNION ALL и подзапросы неэффективны, как для его ввода, так и для выполнения на сервере.

Кроме того, это очень динамичный подход, поскольку вы можете легко управлять значениями в вашей таблице темп, изменяя инструкцию insert.

Однако это будет работать только в том случае, если пользователь базы данных имеет достаточные привилегии: по крайней мере, выберите, создайте временную и удаляемую таблицу.

DROP TABLE IF EXISTS myTempOrders; 
CREATE TEMPORARY TABLE myTempOrders (order_id INTEGER, PRIMARY KEY(order_id)); 
INSERT INTO myTempOrders (order_id) VALUES (1), (2), (100); 

SELECT temp.order_id, count(*) 

FROM myTempOrders temp 
LEFT JOIN remake_error_type ON temp.order_id = remake_error_type.order_id 
GROUP BY 1 

Если order_id значение существует в некоторой таблице, то можно извлечь желаемый результат без создания временной таблицы и вставок значения в нее.

Для участия в таблице

  • должен иметь первичный ключ автоматического приращения с # строк больше, чем максимальная искомой order_id значения
  • имеет начальное значение приращения меньше минимума искать order_id значение
  • не имеют отсутствующих значений в первичном ключе (т. е. никакие записи не были удалены)

, если существует квалифицированная таблица, тогда yo и можно выполнить следующий запрос, где вы должны заменить surrogate с qualified table name и surrogate_id с auto-incrementing primary key из qualified table name

SELECT surrogate.surrogate_id, count(*) 

FROM my_qualified_table surrogate 
LEFT JOIN remake_error_type ON surrogate.surrogate_id = remake_error_type.order_id 
WHERE surrogate.surrogate_id IN (1, 2, 100) 
GROUP BY 1 
+0

Большое спасибо за ваш ответ, у меня нет достаточных привилегий, чтобы создать временную таблицу и удалить ее. Все, что я могу сделать, - это запустить только запрос select. – stack2

+0

Эти значения 'order_id' существуют в некоторой другой таблице? Затем вы можете использовать мой отредактированный ответ. –

+0

Никакой order_id не выходит в другую таблицу. – stack2