首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL中的条件表选择

MySQL中的条件表选择
EN

Stack Overflow用户
提问于 2013-10-23 22:00:51
回答 2查看 2.3K关注 0票数 0

我正在尝试同时访问来自不同表的数据,但我希望能够确定从另一个表中的列的值中提取数据的表。

下面是一个示例:

表A:(id、table1_id、table1_type、table2_id、table2_type)

  • (1,1,'B_Type',2,'E_Type')
  • (2,2,'B_Type',3,'D_Type')
  • (3,1,'C_Type',2,'B_Type')

表B:(id,some_values):

  • (1,“某物”)
  • (2,“其他东西”)

表C、D和E看起来有点类似于B。

因此,我想做以下工作(用伪javascript完成):

代码语言:javascript
复制
result = db.Query("SELECT * from A WHERE [condition] LIMIT 1")
table1 = getTable(result.table1_type) // E.g. 'B' if 'B_Type'
table2 = getTable(result.table2_type)
new_results = db.Query("SELECT * from " + table1 + ", " + table2 + "  WHERE [condition]")

这种方法可以工作,但我希望有一种方法可以根据A的table_type列有条件地选择表。

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-23 22:09:31

如果您真的想这样做,您需要所有多连接中最丑陋的:

代码语言:javascript
复制
SELECT
  IF(A.table1_type='B',B1.some_value,
    IF(A.table1_type='C',C1.some_value,
      IF(A.table1_type='D',D1.some_value,
        IF(A.table1_type='E',E1.some_value,
          NULL)))) AS table1_value,
  IF(A.table2_type='B',B2.some_value,
    IF(A.table2_type='C',C2.some_value,
      IF(A.table2_type='D',D2.some_value,
        IF(A.table2_type='E',E2.some_value,
          NULL)))) AS table2_value
FROM A
  LEFT JOIN B AS B1 ON A.table1_type='B' AND A.table1_id=B1.id
  LEFT JOIN C AS C1 ON A.table1_type='C' AND A.table1_id=C1.id
  LEFT JOIN D AS D1 ON A.table1_type='D' AND A.table1_id=D1.id
  LEFT JOIN E AS E1 ON A.table1_type='E' AND A.table1_id=E1.id
  LEFT JOIN B AS B2 ON A.table2_type='A' AND A.table2_id=B2.id
  LEFT JOIN C AS C2 ON A.table2_type='B' AND A.table2_id=C2.id
  LEFT JOIN D AS D2 ON A.table2_type='C' AND A.table2_id=D2.id
  LEFT JOIN E AS E2 ON A.table2_type='D' AND A.table2_id=E2.id
WHERE [condition for A];

编辑

一些解释: MySQL (作为大多数SQL数据库)没有在表之间动态切换的“有意”方法。这使得有必要加入所有的表,然后删除除一个结果之外的所有结果。对用例重复两次。

票数 2
EN

Stack Overflow用户

发布于 2013-10-23 23:36:11

如果您想避免做大量的联接,您应该能够使用游标和一些动态SQL来完成这一任务。

下面是一个示例(这是使用MSSQL语法编写的,但我认为它在MySql中是相近的,如果不是相同的话):

代码语言:javascript
复制
CREATE TABLE #result
(table1Val varchar(50), table2Val varchar(50))

DECLARE @sql VARCHAR(MAX)

DECLARE @table1_val int, @table1_type varchar(50), @table2_val int, @table2_type varchar(50)
DECLARE cur CURSOR FOR
SELECT table1_id, table1_type, table2_id, table2_type
FROM A

OPEN cur
FETCH NEXT FROM Cur INTO @table1_val, @table1_type, @table2_val, @table2_type

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = '
        INSERT INTO #result
        (SELECT val FROM ' +CASE @table1_type WHEN 'B_Type' THEN 'B' WHEN 'C_type' THEN 'C' + ' WHERE id = '''+@table1_val+'''),
        (SELECT val FROM ' +CASE @table2_type WHEN 'B_Type' THEN 'B' WHEN 'C_type' THEN 'C' + ' WHERE id = '''+@table2_val+''')
    '
    EXEC(@sql)
    --use this instead to debug the dynamic query
    --PRINT(@sql)
END
    UPDATE @JoinResult
    SET B_ID = SQ.ID,
        B_Age = SQ.AGE,
        B_Education = SQ.Education
    FROM (
        SELECT ID, AGE, EDUCATION
        FROM TableB b
        WHERE (
            abs((SELECT A_Age FROM @JoinResult WHERE A_Id = @i) - AGE) <=2
            AND abs((SELECT A_Education FROM @JoinResult WHERE A_Id = @i) - EDUCATION) <=2
        ) AND (SELECT B_ID FROM @JoinResults WHERE B_ID = b.id) IS NULL
    ) AS SQ 

CLOSE cur
DEALLOCATE cur
SELECT #result
DROP TABLE #result
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19553112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档