Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 基于表字段从不同表中收集值_Mysql - Fatal编程技术网

Mysql 基于表字段从不同表中收集值

Mysql 基于表字段从不同表中收集值,mysql,Mysql,假设我有以下表格结构: 表1 主标识|类型|信息 first segway excellent second car mercedes third bike sliceofwind 赛格威表 id |等级 1 excellent 2 bad 3 (...) 桌上汽车 id |品牌 1 mercedes 2 honda 3 (...) 桌上自行车 id |轮胎 1 sliceofwind 2 flatasfaque 3 (...) 我想做的是根据表1中的类

假设我有以下表格结构:

  • 表1
主标识|类型|信息

first segway excellent
second car   mercedes
third  bike  sliceofwind
  • 赛格威表
id |等级

1  excellent
2  bad
3 (...)
  • 桌上汽车
id |品牌

1  mercedes
2  honda
3  (...)
  • 桌上自行车
id |轮胎

1 sliceofwind
2 flatasfaque
3 (...)
我想做的是根据表1中的类型从不同的表中直接获取信息

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

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东西,我在这里要问的是,尽管有人建议或没有建议,但是否确实有可能这样做,以及原因!)。

这可能是一种方法

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表列将为null。 然而,这似乎会返回比您需要的更多的数据/列。我认为最好在数据库之外编写单独的查询,并根据它们选择的值调用它们。或者使用数据库中的过程和条件逻辑返回所需的结果集。(同样是3个独立的查询和数据库中的条件逻辑)但如果不理解用例,我真的说不出哪一个更好

我们可以进一步将品牌、轮胎和等级合并到“价值”字段中,如中所示

选择t1.*,coalese(s.grade、c.brand、b.tires)作为值
,但我不确定这是否有任何帮助

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


我看不出笛卡尔函数是如何以这种方式出现的。

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

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);

您是否尝试过distinct select?您可以这样做