2014-12-20 12 views
8

considerare Ho una tabella come la seguente:Mysql ottenere tutti i record descritti in in buone condizioni, anche se non esiste nella tabella di

my_table

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

E dire che ho una query come questa

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

È possibile ottenere l'output come il seguente, cambiando la query.

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

Ho provato ad utilizzare auto JOIN e le altre condizioni e anche google'd molto, ma non ha trovato una soluzione.

Qualcuno può suggerire una soluzione?

+0

Su quali condizioni si prevede un risultato nullo? – Abovestand

+0

In generale, non è possibile selezionare da una tabella dati che non sono presenti in quella tabella, né si desidera effettuare – Strawberry

+0

@ La risposta di Juergen è corretta. Non avrebbe dovuto cancellarlo. –

risposta

8

Sfortunatamente, mysql non ha una funzione incorporata che genera una serie come fanno molti altri database). Ci sono (almeno) due modi per farlo:

codificare i valori desiderati come una sottoquery, poi a sinistra unirsi alla vostra tavola:

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 

Ma questo è noioso e difficile da codificare e mantenere.

O (come ho fatto prima) creare una tabella (una sola volta) e popolare con i numeri naturali (una volta) da utilizzare come generatore serie di proxy:

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

poi:

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) 

Una volta impostato e popolato con un sacco di numeri, questo approccio è molto utile.

È possibile creare una tabella simile popolata con date, utilizzata in modo simile, che è molto utile per produrre cifre per ogni data in un intervallo quando non tutte le date contengono dati.

+0

Avere un Handegg. –

+0

Oh ne hai già avuto uno! Ah bene. –

2

È possibile creare una serie di numeri senza dover creare una tabella aggiuntiva o senza condizioni di scrittura per ciascun valore che è necessario cercare. You can use a variable rownum, initialize with value 0 & increase it by 1 to easily create a serie by using ‘limit’. Ho usato la tabella INFORMATION_SCHEMA.COLUMNS in modo da poter creare una serie grande (puoi usare qualsiasi tabella più grande che hai nel tuo DB o qualsiasi tabella abbastanza grande per le tue esigenze).

SQL Fiddle

MySQL 5.6.6 m9 Setup Schema:

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

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

Query 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

è possibile utilizzare clausola IN, come avete fatto e come si può vedere qui http://www.tutorialspoint.com/mysql/mysql-in-clause.htm

Ho eseguito un test da solo e ho restituito il nome come previsto da 1 a 4, ma quando inserisco l'id che non esiste mysql query non restituirà nulla per questo id, perché non esiste nel database.

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 

Se volete davvero questo tavolo, penso che si potrebbe provare un po 'di stored procedure per formattare la tabella di output. Qui puoi saperne di più. http://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html e qui 'IF' in 'SELECT' statement - choose output value based on column values

Problemi correlati