查询显示其中一个值为0的关系的结果

时间:2013-08-20 11:37:53

标签: mysql

我有3个表格,结构如下:

fornecido

+-------------+--------------+----------+--------+
| codmaterial | idfornecedor | idmodelo | preco  |
+-------------+--------------+----------+--------+
|     8978998 |            0 |      234 | 2.00   |
|     8978998 |          718 |        0 | 22.00  |
|     8978998 |          578 |      201 | 222.00 |
+-------------+--------------+----------+--------+

fornecedor

+--------------+---------------------------+---------+
| idfornecedor |           nome            | contact |
+--------------+---------------------------+---------+
|          578 | ACAR-IMPORT.EXPORT.LD.    | NULL    |
|          580 | ACCESS OFFICE VB          | NULL    |
|          581 | ACCIOP-CONST.OBR.PUB.,LD. | NULL    |
|          582 | ACCUSONIC TECHNOLOGIES    | NULL    |
|          583 | ACE NAVILECTRA TOME       | NULL    |
|          584 | ACE-ART.CIRURG.EUROPA,LD. | NULL    |
|          718 | ADIHOTEL-MAQ.EQUIP.HOT.LD | NULL    |
+--------------+---------------------------+---------+

莫德洛

+----------+-----------------+
| idmodelo |      nome       |
+----------+-----------------+
|      224 | 24TDMEJ50       |
|      140 | 259118          |
|      201 | 122AVP          |
|      234 | 1YMB531002M0005 |
+----------+-----------------+

我想用fornecedor和modelo的名称而不是id来显示结果。

SELECT
  fornecedor.nome, modelo.nome, preco
FROM
  fornecido, fornecedor, modelo
WHERE
  fornecido.codmaterial=8978998 AND condition

我尝试或导致所有可能组合的每个条件或唯一同时具有fornecedor和modelo的条件:s

我假装像:

null, 1YMB531002M0005, 2.00
ADIHOTEL-MAQ.EQUIP.HOT.LD, null, 22.00
ACAR-IMPORT.EXPORT.LD., 122AVP, 222.00

谢谢:)

2 个答案:

答案 0 :(得分:2)

SELECT
fn.nome as FNOME, m.nome as MNOME, f.preco
FROM  fornecido f left join fornecedor fn 
on f.idfornecedor = fn.idfornecedor 
left join modelo m on f.idmodelo =m.idmodelo 
WHERE f.codmaterial=8978998

在此检查SQlFiddle http://sqlfiddle.com/#!2/251cc/5/0

供参考:

http://placeisimportant.files.wordpress.com/2013/02/sql-joins-vis-rep-1.png http://placeisimportant.files.wordpress.com/2013/02/sql-joins-vis-rep-2.png

答案 1 :(得分:2)

首先,我喜欢构建查询,以便查看表之间的关系。接下来,您将特别关注其中一个(或两个)值对于其中一个列的值为零,但显然不希望对特定条目进行硬编码。

SELECT
      fn.nome, 
      m.nome, 
      f.preco
   FROM  
      fornecido f 
         LEFT JOIN fornecedor fn 
            on f.idfornecedor = fn.idfornecedor
         LEFT JOIN modelo m 
            on f.idmodelo = m.idmodelo 
   WHERE 
      f.codmaterial = 8978998
      AND (   f.idfornecedor = 0
           OR f.idmodelo = 0)

在这种情况下,您可能需要使用LEFT JOIN,因为相应的表不会有ID为0的记录要加入,并且使用INNER JOIN意味着它必须存在于连接表中。 LEFT JOIN允许“fornecido”表仍然显示记录,无论与其他LEFT JOINed表匹配。

WHERE子句检查= 0(或者你可以检查“其他”表的NULL)。