根据表字段从不同的表中收集值

时间:2014-05-16 15:02:19

标签: mysql

假设我有以下表结构:

  • 表1

main_id |类型|信息

first segway excellent
second car   mercedes
third  bike  sliceofwind
  • TABLE segway

id |等级

1  excellent
2  bad
3 (...)
  • 乒乓球

id |品牌

1  mercedes
2  honda
3  (...)
  • TABLE bike

id |轮胎

1 sliceofwind
2 flatasfaque
3 (...)

我想做的是根据table1 中的类型从dinamically获取不同表格中的信息。

以下是我尝试过的查询的一般示例

SELECT (CASE 
WHEN table1.type = 'segway' AND segway.grade = table1.information 
     THEN segway.id,
WHEN table1.type = 'car' AND car.brand = table1.information 
     THEN car.id,
WHEN table1.type = 'bike' AND bike.tires = table1.information 
     THEN bike.id 
        END) AS information 
FROM table1,segway,bike,car WHERE table1.main_id IN ("ids")

此查询的结果是笛卡尔积,因为尽管案例中存在限制,但所有表中的所有数据都将被检索,因为并非所有表都有限制。 我想知道是否有办法在不改变表结构的情况下解决这个问题,如果没有请求一些提示! (我有些讨厌的sql东西,我在这里问的是否确实可能这样做,尽管它被建议与否以及为什么!)。

2 个答案:

答案 0 :(得分:1)

这可能是一种方法。

SELECT t1.*
FROM table1 t1
LEFT JOIN segway s 
  on T1.main_id = s.id and T1.type= 'segway'
LEFT JOIN car c 
  on T1.main_id = c.id and T1.type= 'car'
LEFT JOIN bike b
  on T1.main_id = b.id and T1.type= 'bike'
WHERE t1.main_ID in (SomeList)
当Table1的类型不匹配时,

segway,car和bike table列将为null。 但是,这似乎会为您提供比您需要的更多的数据/列。我认为你最好在数据库外编写单独的查询,并根据他们选择的值调用它们。或者使用数据库中的过程和条件逻辑来返回所需的结果集。 (再次在数据库中有3个单独的查询和条件逻辑)但是如果不了解用例,我真的不能说哪个更好。

我们可以将品牌,轮胎和等级进一步分类到“价值”领域,如

Select t1.*, coalese(s.grade,c.brand,b.tires) as value但我不确定这会提供任何帮助。

如果我们只需要返回表1的值并从其他表中设置值...你说的是淫,而不是我。

我看不出笛卡尔会如何发生这种情况。

答案 1 :(得分:0)

这将是您的预期结果,请尝试此查询..

SELECT (CASE WHEN s.`id` IS NOT NULL THEN s.`id` 
 WHEN c.`id` IS NOT NULL THEN c.`id` 
 WHEN b.`id` IS NOT NULL THEN b.`id` 
END) AS information FROM table1 AS t1
 LEFT JOIN segway s ON t1.type= 'segway'
 LEFT JOIN car c ON t1.type= 'car'
 LEFT JOIN bike b ON t1.type= 'bike' 
WHERE t1.main_ID IN (1, 2, 3) AND (t1.information = s.`grade` OR 
                                   t1.`information`=c.brand OR 
                                   t1.`information`=b.tires);