2010-10-25 8 views
2

Existe-t-il un moyen de mettre à jour les tables dans mysql?MySQL if/else pour les tables

Exemple:

select * from tableA A, if(tableA.find=1,TableBA B,TableBB B) where A.id = B.aid 

réel Exemple:

tables sont: location_order, order_contract, order_gm, order_gm_hh:

select * 
from location order lo, order_contract oc, if(lo.hh=0,order_gm,order_gm_hh) as og 
where lo.orderid = oc.orderid && oc.gmid = og.id 
+0

Cela ressemble à de sérieux problèmes de normalisation si votre clé étrangère est liée à plusieurs tables en fonction d'une valeur de tableA. – JohnFx

+0

Le problème est que j'ai une table qui définit un ordre et deux tables différentes pour les calculs. En fonction d'un champ dans l'ordre est la table et l'ensemble de code que j'utilise, mais je dois être en mesure d'exécuter un résumé des deux en même temps. Une autre question avec la même question de base; juste oublié jusqu'à ce que j'ai posté. http://stackoverflow.com/questions/3924632/mysql-select-from-different-table-depending-on-master-table – David

+0

Pourriez-vous montrer des noms de tables réalistes dans votre exemple? Le commentaire est un peu difficile à suivre. – JohnFx

Répondre

2

Vous pouvez left outer join les deux tables, puis utilisez la fonction IF() dans la clause SELECT:

SELECT  a.*, 
      IF(a.find = 1, b1.value, b2.value) b_value 
FROM  tableA a 
LEFT JOIN tableBA b1 ON (b1.aid = a.id) 
LEFT JOIN tableBB b2 ON (b2.aid = a.id); 

Cas de test:

CREATE TABLE tableA (id int, find int, value int); 
CREATE TABLE tableBA (id int, aid int, value int); 
CREATE TABLE tableBB (id int, aid int, value int); 

INSERT INTO tableA VALUES (1, 1, 100); 
INSERT INTO tableA VALUES (2, 0, 200); 
INSERT INTO tableA VALUES (3, 1, 300); 
INSERT INTO tableA VALUES (4, 0, 400); 

INSERT INTO tableBA VALUES (1, 1, 10); 
INSERT INTO tableBA VALUES (2, 3, 20); 

INSERT INTO tableBB VALUES (1, 2, 30); 
INSERT INTO tableBB VALUES (2, 4, 40); 

Résultat:

+------+------+-------+---------+ 
| id | find | value | b_value | 
+------+------+-------+---------+ 
| 1 | 0 | 100 |  10 | 
| 2 | 1 | 200 |  30 | 
| 3 | 0 | 300 |  20 | 
| 4 | 1 | 400 |  40 | 
+------+------+-------+---------+ 
4 rows in set (0.00 sec) 
+0

Cela prend beaucoup trop de temps pour trouver les résultats. Les tables ont 1000 et éventuellement 10k à 100k d'enregistrements. Merci ça me donne quelques idées. – David

+0

@David: Avez-vous un index sur les colonnes 'aid' dans les tables' tableBA' et 'tableBA'? Cela ne devrait pas être si lent, même 100ks de lignes, si correctement indexé. –

+0

Je fais un peu plus de test maintenant – David

0

Vous pourriez avoir à séparer ceci dans deux instructions select. Par exemple:

select * from tableA A 
inner join TableBA B on A.id = B.aid 
where A.find = 1 

UNION 

select * from tableA A 
inner join TableBB B on A.id = B.aid 
where A.find <> 1 
0

Effectuez une jointure externe sur les deux tables et utilisez une instruction case dans select pour extraire la valeur de la table répondant au critère Find = 1 à l'aide d'une instruction case.

SELECT  Case A.Find 
       WHEN 1 THEN B1.SomeField 
       ELSE B2.SomeField 
      END as SomeField 
FROM  tableA A 
LEFT JOIN tableBA b1 ON (b1.aid = A.id) 
LEFT JOIN tableBB b2 ON (b2.aid = A.id);