2009-09-01 7 views
0

Voici le scénario.SELECT à partir de diverses tables, avec une liste d'index

Je développe un système de minuterie; J'ai ces tableaux:

-punch (id_punch,date) 
-in1 (id_in1,time,id_punch,...) 
-in2 (id_in2,time,id_punch,...) 
. 
-in6 (id_in6,time,id_punch,...) 
-out1 (id_out1,time,id_punch,...) 
-out2 (id_out2,time,id_punch,...) 
. 
-out6 (id_out6,time,id_punch,...) 

Ma question est, comment puis-je avec une seule requête en PHP pour obtenir toutes les valeurs de et table en, à partir d'une liste de valeurs id_punch, par exemple:

Get Je veux dire ... à partir d'une liste de id_punch entre deux dates, obtenir tous les résultats de la table in, out.

La seule façon dont je pense est de faire une requête avec chaque variable id_punch, mais dans un mois ses environ 20-25 requêtes ... à beaucoup?

Répondre

0

Votre schéma de base de données est un peu flou, mais si vous demandez comment obtenir les résultats correspondant à une liste d'identifiants que vous avez déjà cela devrait fonctionner (en supposant que vos identifiants sont 1,3,5,7,9)

SELECT * FROM table1, table2, table 3 
WHERE table1.punch_id = table2.punch_id AND table2.punch_id = table3.punch_id AND table3.punch_id IN (1,3,5,7,9) 

vous aurez probablement besoin de le modifier juste se assurer la punch_id de chaque table est jointe à celle de la contrainte

1

pour obtenir toutes les données des tables que vous aurez besoin de les joindre à JOINMySQL JOIN Mais d'après ce que je peux comprendre en vous regardant, vous devriez probablement penser à faire ceci dans une table plutôt que dans les multiples tables que vous avez ici.

0

Je ne peux pas utiliser une table parce que j'ai des informations dans chaque punch, comme adresse ip, et d'autres informations. Neil, la réponse était dans mon nez, j'ai déjà vu une solution comme la vôtre, mais mon doute est de savoir comment mettre la liste dans la requête, répondre à ma propre question = utiliser un foreach() en php pour "peupler" "cette liste ...

Quelque chose comme:

> SELECT * FROM table1, table2, table 3 WHERE table1.punch_id = table2.punch_id AND table2.punch_id = table3.punch_id AND table3.punch_id IN (<? foreach($query->results() as $row) echo $row->id_punch;?>) 

im en utilisant CodeIgniter

+0

Je ne vois toujours pas pourquoi cela ne pouvait pas être en une seule table. Le plus gros problème que je vois immédiatement est ce qui se passe quand l'utilisateur tape et sort plus de fois qu'il n'y a de tables? Croyez-moi, cela arrivera. Les utilisateurs s'impatienteront, oublieront s'ils ont perforé etc. – nelsonslament

1

Vous avez vraiment besoin de stocker toutes les données d'entrée/sortie dans une table qui est un enfant de punch:

CREATE TABLE punch (
    id_punch SERIAL PRIMARY KEY, 
    punch_date DATE NOT NULL, 
    ip_address INT UNSIGNED NOT NULL 
    -- plus other attributes 
) ENGINE=InnoDB; 

CREATE TABLE inout (
    id_punch BIGINT UNSIGNED, 
    in_time TIME NOT NULL, 
    out_time TIME NULL, 
    PRIMARY KEY (id_punch, in_time), 
    FOREIGN KEY (id_punch) REFERENCES punch (id_punch) 
) ENGINE=InnoDB; 

Maintenant, vous pouvez interroger très facilement pour tous les coups de poing en Septembre:

SELECT * 
FROM punch LEFT OUTER JOIN inout USING (id_punch) 
WHERE EXTRACT(YEAR_MONTH FROM punch_date) = '200909'; 
Questions connexes