2010-05-11 3 views
0

Je possède ce tableaumysql IF EXISTS

UMS 

id_attribute value order 
1    MB  1 
1    Gb  2 
1    TB  3 
... 

et ce tableau

ATTRIBUTE_VALUE 
id id_attribute   value name  ums 
1   1     50  hdd  GB 
2   1     100 hdd  TB 
3   2     15.00 price NULL 

et je veux choisir parmi ATTRIBUTE_VALUE où id_attribute = 1 et si exist (UMS.value = ATTRIBUTE_VALUE.ums) puis par ordre UMS.order end if group by ATTRIBUTE_VALUE.value

exemple pour la sortie:

50 GB 
100 Tb 

    and must to appear 
    15.00 !!! here is the problem because in my UMS table i don't have UMS for price 

    but it doesn't appear 
+0

Que devrait * faire quelque chose * être? Quelque chose qui devrait être exécuté avec SQL ou quelque chose en PHP? (de toute façon, 'EXISTS (SELECT * FROM y où 1 = 1)' évaluera toujours 'true') –

+0

Je veux quelque chose qui devrait être exécuté avec PHP, parce que j'ai ceci: select * from y où 1 = ' $ value ' et si c'est vrai alors commandez par nom sinon ordonner par prix ou quelque chose comme ça – cosy

+1

@cosy: Cela ne clarifie pas vraiment la question. Pourriez-vous s'il vous plaît modifier votre question et fournir une explication décente de ce que vous essayez d'atteindre? –

Répondre

6

mise à jour après avoir éclairci votre question - Essayez quelque chose comme ceci:

SELECT T1.* 
FROM ATTRIBUTE_VALUE T1 
LEFT JOIN UMS T2 
ON T1.id_attribute = T2.id_attribute AND T1.ums = T2.value 
ORDER BY T2.order, T1.value 

Mais notez que cela échouera si T1.value est supérieur à 1000. Il pourrait être préférable de convertir toutes les unités du même type avant de les commander.

Résultat de la recherche:

id id_attribute value name ums 
3 2    15.00 price  
1 1    50  hdd  GB 
2 1    100 hdd  TB 
+0

Mais comment puis-je faire quelque chose comme ça? – cosy

+0

Le problème est que, dans cette table nommée attribute_value, j'aurai un attribut qui n'apparaîtra pas dans la table UMS. Et dans ce cas ma sélection s'est arrêtée – cosy

+0

Merci! Je résous mon problème, seul. De toute façon vous avez la meilleure réponse! – cosy

0

Vous pouvez rendre une ordonnance conditionnelle par MySQL, comme celui-ci, par exemple:

user 
id name 

select * 
from user 
order by (case when id <5 then id else name end) 

Cependant, vous avez deux tables, vous avez besoin de vous joindre à eux, je ne suis toujours pas sûr si vous pouvez obtenir ce dont vous avez besoin de cette façon. En outre, vous ne pouvez pas commander avec DESC sur une branche et ASC sur une autre.

0

Finlay J'ai obtenir ma propre réponse:

c'est le code:

$nr_ordine=0; 
$virgula=""; 
$ordine="valoare"; 
$ordine2="FIELD(unitate_masura,"; 
$sql_ums=mysql_query("select * from atribute_masura where id_atribut='".$exe_atribut['id']."' order by ordine asc"); 
while($exe_ums=mysql_fetch_array($sql_ums)) 
{ 
$nr_ordine++; 
if($nr_ordine>1) 
{ 
$virgula=","; 
}; 


$ordine2.=$virgula."'".$exe_ums['valoare']."'"; 
}; 
$ordine2.=")"; 
if($ordine2!="FIELD(unitate_masura,)") 
{ 
$ordine=$ordine2; 
}; 


$s_q0=mysql_query("select * from atribute_cautare where id_atribut='".$exe_atribut['id']."' group by valoare order by $ordine asc") or die (mysql_error());   
while($s_q=mysql_fetch_array($s_q0)) 
{ 

... 
}; 

Les noms correspondent pas à ma question, mais c'est l'ordre idée par domaine (UMS, 'kb' , 'mb', 'gb', 'tb')