【问题标题】:Combine 2 requirements in 1 query在 1 个查询中结合 2 个需求
【发布时间】:2016-02-16 04:14:16
【问题描述】:

我有一个需要编辑的现有 PHP 项目。还有一个包含一些内容的数据库。

部分表格组织如下:

表:tab_col

Col1
Col2
Col3
...

checkbox

id   column
1    Col1
2    Col4
...

其中一项任务是显示tab_col 的所有列。在它们旁边需要放置一个输入字段。如果tab_col 中的一列名称存在于表checkbox 中,则会在列名称旁边放置一个复选框。否则它是一个文本字段。

因此,在这种情况下,将在 Col1Col4 旁边放置一个复选框。
它应该是这样的:https://jsfiddle.net/e7Lpfs9f/

其实我只对SQL查询感兴趣。


通过这个查询,我得到所有列:

SHOW columns FROM tab_col

但是我怎样才能在 1 个查询中结合这两个要求呢?我不想查询数据库两次。


PS:我知道,这可能不是在数据库中存储数据的最佳方式,但这是我必须使用的。

【问题讨论】:

    标签: mysql sql checkbox mariadb


    【解决方案1】:

    你可以的

    SELECT t1.column_name, ch.id
    FROM information_schema.Columns t1
    LEFT JOIN checkbox ch
      ON t1.column_name = ch.column
    WHERE t1.table_name = 'tab_col'
    ORDER BY t1.column_name;
    

    如果ch.idNULL,则该列不在checkbox

    【讨论】:

    • 对不起,第二张桌子我错了。列名存储在列column中。
    • @user1170330 嗯,我不确定你在说什么。根据this,表的列存储在column_name
    • 请看我的编辑。表checkbox 中的列名也存储在另一列中,称为column
    • 好的,太好了!谢谢!但是如果有另一张桌子怎么办,例如单选按钮。那怎么区分呢?
    • 好吧,我想你可以加入它并为单选按钮添加另一列?或者根据您的需要在 php 中构建 SQL...
    【解决方案2】:

    你可以用存储过程来解决这个问题

    WITH CTE1 (
            SELECT column_name
            FROM [DB_NAME].INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = N'tbl_col'
        )
    
    WITH CTE2 (
            SELECT column_name
            FROM [DB_NAME].INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = N'checkbox'
        )
    
    SELECT c1.column_name, 
         CASE ISNULL(c2.column_name,'0')
                 WHEN '0' THEN 'checkbox'
                 ELSE 'textbox'
         END 
             FROM CTE1 c1
       LEFT JOIN CTE2 c2 on c2.column_name = c1.column_name
    

    因此,如果 tbl_col 表和复选框表之间存在匹配,则为文本框,否则为复选框

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      相关资源
      最近更新 更多