SQL Join多表

时间:2014-04-25 23:11:31

标签: mysql sql join

我有这三张桌子:

fieldValues|values|formCustomizeValues |
-----------|------|--------------------|
FieldID    |ID    |FormCustomizeFieldID|
ValueID    |Name  |FieldID             |
           |      |ValueID             | 
-----------|------|--------------------|

这些表格的数据如下所示:

fieldValues|values|formCustomizeValues|
-----------|------|-------------------|
4          |1     |1                  |
1          |James |4                  |
-----------|------|3                  |
4          |2     |-------------------|
2          |Ben   |
-----------|------|
           |3     |
           |Daniel|

我要做的是获取特定字段的所有值。 所以我想说我想要使用等于FieldID的{​​{1}}获取所有值,我应该得到:

4

但我尝试了5个不同的查询,我得到的唯一内容是James Ben Daniel James, Ben

这是一个返回零Daniel的查询:

results

该查询只返回SELECT v.* FROM `fieldValues` fv LEFT JOIN `values` v ON fv.ValueID = v.ID LEFT JOIN formCustomizeValues fcv ON fcv.FieldID = fv.FieldID AND fcv.ValueID = v.ID WHERE fv.FieldID = 4 AND fcv.FormCustomizeFieldID = 1

James, Ben

我如何将它们全部组合在一起? 任何帮助将不胜感激!! 谢谢!

这是SQLfiddle链接:http://sqlfiddle.com/#!2/43b56/1

2 个答案:

答案 0 :(得分:1)

这就是你想要的:

  • 1通过fieldValues
  • 检索名称的查询
  • 1通过formCustomizeValues
  • 检索名称的查询
  • 联盟加入两项结果

查询:

SELECT
    v.`Name`
FROM
    `values` v
    INNER JOIN  `fieldValues` as fv
        on v.`ID` = fv.`ValueID`
        and fv.`FieldID` = 4
UNION
SELECT
    v.`Name`
FROM
    `values` v
    INNER JOIN  `formCustomizeValues` as fcv
        on v.`ID` = fcv.`ValueID`
        and fcv.`FieldID` = 4

这里是SQLFIDDLE UPDATED

答案 1 :(得分:0)

撇开对架构设计的任何批评......

SELECT v.name 
  FROM `values` v
  LEFT JOIN `fieldValues` fv ON fv.ValueID = v.ID
  LEFT JOIN `formCustomizeValues` fcv ON fcv.ValueID = v.ID
 WHERE fv.FieldID = 4
    OR fcv.FormCustomizeFieldID = 1
;

Updated Fiddle

更新

我现在看到你说的第一个查询导致没有行实际上非常接近。您希望values fieldValues中定义的所有formCustomizeValues行。使用AND不会产生任何行,因为没有行符合这两个条件。因此,您希望使用OR或使用UNION,如Ryx5所建议的那样。

SELECT v.name 
  FROM `values` v
  LEFT JOIN `fieldValues` fv ON fv.ValueID = v.ID
  LEFT JOIN `formCustomizeValues` fcv ON fcv.ValueID = v.ID
 WHERE fv.FieldID = 4
    OR fcv.FormCustomizeFieldID = 1
;

Updated updated Fiddle