2014-12-20 3 views
8

Рассматривают У меня есть таблица вроде следующего:Mysql получить все записи, описанные в в состоянии, даже если она не существует в таблице

my_table

+---------------+ 
| id | name | 
+---------------+ 
| 1 | ABC | 
+---------------+ 
| 2 | XYZ | 
+---------------+ 
| 3 | PQR | 
+---------------+ 
| 4 | LMN | 
+---------------+ 

И у меня есть запрос, как этот

select * from my_table where id in (1,2,3,4,5) 

Возможно ли получить результат следующим образом, изменив запрос.

+---------------+ 
| id | name | 
+---------------+ 
| 1 | ABC | 
+---------------+ 
| 2 | XYZ | 
+---------------+ 
| 3 | PQR | 
+---------------+ 
| 4 | LMN | 
+---------------+ 
| 5 | NULL | 
+---------------+ 

Я попытался с помощью автообъединение и других условий, а также google'd много, но не нашел решения.

Может ли кто-нибудь предложить решение?

+0

В каком состоянии вы ожидаете нулевой результат? – Abovestand

+0

В целом вы не можете выбрать из таблицы данные, которых нет в этой таблице, и вы также не хотите – Strawberry

+0

@ Ответ Юргена правильный. Он не должен был удалять его. –

ответ

8

К сожалению, mysql не имеет встроенной функции, которая генерирует серию, как это делают многие другие базы данных). Есть (по крайней мере) два способа сделать это:

Жесткий код требуемые значения в качестве подзапроса, затем налево присоединиться к вашему столу:

select x.id, t.name 
from (select 1 id 
    union select 2 
    union select 3 
    union select 4 
    union select 5) x 
left join my_table t on t.id = x.id 

Но это утомительно и трудно кодировать и поддерживать.

Или (как я делал раньше) создать таблицу (один раз) и заполнить натуральными числами (один раз), чтобы использовать в качестве прокси-серии генератора:

create table numbers (num int); 
insert into numbers values (1), (2), (3), ... etc 

затем:

select n.num id, t.name 
from numbers n 
left join my_table t on t.id = n.num 
where n.num in (1,2,3,4,5) 

После установки и заполнения большого количества чисел этот подход очень удобен.

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

+0

Имейте Handegg. –

+0

У вас уже был один! Ах хорошо. –

2

Вы можете создать серийный номер без необходимости создавать дополнительную таблицу или без условий записи для каждого значения, которое необходимо было выполнить. You can use a variable rownum, initialize with value 0 & increase it by 1 to easily create a serie by using ‘limit’. Я использовал таблицу INFORMATION_SCHEMA.COLUMNS, чтобы вы могли создать большую серию (вы можете использовать любую большую таблицу, которая у вас есть в вашей БД или любой таблице, достаточно большой для ваших нужд).

SQL Fiddle

MySQL 5.6.6 M9 Настройка схемы:

CREATE TABLE my_table 
    (`id` int, `name` varchar(3)) 
; 

INSERT INTO my_table 
    (`id`, `name`) 
VALUES 
    (1, 'ABC'), 
    (2, 'XYZ'), 
    (3, 'PQR'), 
    (4, 'LMN') 
; 

Запрос 1:

select rownum id, name 
from (
select @rownum:[email protected]+1 as rownum 
from INFORMATION_SCHEMA.COLUMNS,(SELECT @rownum:=0) r limit 5) as num 
left outer join my_table on id = rownum 

Results:

| ID | NAME | 
|----|--------| 
| 1 | ABC | 
| 2 | XYZ | 
| 3 | PQR | 
| 4 | LMN | 
| 5 | (null) | 
0

вы можете использовать пункт IN, как вы это делали и как вы можете видеть здесь http://www.tutorialspoint.com/mysql/mysql-in-clause.htm

Я сам выполнил тест, и он вернул имя, как ожидалось, от 1 до 4. Но когда я помещаю один идентификатор, который не существует, mysql-запрос ничего не вернет для этого идентификатора, потому что он не существует в базе данных.

SELECT * FROM employee_tbl WHERE id IN (1,2,3,4,5,6,7,8); 

1 John 250 
2 Ram  220 
3 Jack 170 
4 Jack 100 
5 Jill 220 
6 Zara 300 
7 Zara 360 

Если вы действительно хотите эту таблицу, я думаю, вы можете попробовать некоторые хранимые процедуры для форматирования выходной таблицы. Здесь вы можете узнать больше об этом. http://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html и здесь 'IF' in 'SELECT' statement - choose output value based on column values

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