簡體   English   中英

選擇帶有索引的列名

[英]Select column names with index

考慮以下SQL

SHOW INDEX FROM table1

這將打印出用作table1索引的列名。

我想知道是否可以在另一個查詢中嵌入這樣的查詢,例如:

SELECT (index column names on table1) FROM table1 WHERE ...

有沒有辦法選擇這些查詢中使用的列名稱?

由於無法子查詢SHOW (請參閱子查詢以獲取子查詢中允許的語句),因此請使用兩個查詢:

//獲取列
$ q = mysql_query(“ SHOW INDEX FROM table”);

//使用列
$ result = mysql_query(“ SELECT” .mysql_result($ q,0,'Column_name')。“ FROM table ...”);

對於安全檢查,起見你應該檢查,如果一個索引 ,並確定的情況下,使用哪個索引,你有一個以上的

 //check for 0, 1 or more indexes
 switch(mysql_num_rows($q)){  
 case 0:
    echo 'no index';  
    break;  
 case 1:  
    $result = mysql_query("SELECT ".mysql_result($q,0,'Column_name')." FROM table ...");  
    break;  
 default:  
    echo 'more than one index';  
    break;
 }  

您可以使用mysql_result的第二個參數來選擇索引,如下所示:

//選擇索引nr.2
$ result = mysql_query(“ SELECT” .mysql_result($ q, 1 ,'Column_name')。“ FROM table ...”);

根據建議,您可以分幾個階段執行此操作,因為您可以使用PHP編寫腳本。 您還可以通過使用information_schema表和預處理語句僅使用查詢(例如,從命令行)來完成此操作,如下所示:

SET @COLNAME = (SELECT `COLUMN_NAME` FROM `information_schema`.`COLUMNS` WHERE  `TABLE_SCHEMA` = "myDatabaseName" AND `TABLE_NAME` = "myTable" AND `COLUMN_KEY` = "pri");

SET @QRY = CONCAT("SELECT ", @COLNAME , " FROM `myTable`");

PREPARE stmnt FROM @QRY ;
EXECUTE stmnt;

當然,這要求查詢用戶具有對信息模式表和目標表的許可。

這是一個在工作的小例子: http : //sqlfiddle.com/#!2/9c753/2

要在PHP中完成此操作,您必須將其分解為其他答案中建議的步驟。 如果作為單個字符串傳遞,PDO至少似乎不想處理此查詢。

文獻資料

為了回答這個問題,我將使用mydb.mytable

首先,一個表可以有多個索引。

您可以從INFORMATION_SCHEMA.STATISTICS找出表具有的所有索引。

SELECT DISTINCT index_name IndexName FROM INFORMATION_SCHEMA.STATISTICS
WHERE table_schema='mydb' AND table_name='mytable';

您將必須從mydb.mytable選擇所需的索引。

假設索引稱為myindex

您接下來需要做的是GROUP_CONCAT函數,以創建以逗號分隔的列名列表。 放在一起,您應該能夠像這樣編寫查詢:

SET @mydb = 'mydatabase';
SET @mytb = 'mytable';
SET @mynx = 'myindex';
SET @dbtb = CONCAT(@mydb,'.',@mytb);
SELECT GROUP_CONCAT(column_name)
INTO @IndexColumns
FROM INFORMATION_SCHEMA.STATISTICS
WHERE table_schema=@mydb
AND table_name=@mytb
AND index_name=@mynx;
SELECT CONCAT('SELECT ',@IndexColumns,' FROM ',@dbtb) INTO @sqlstmt;
SELECT @sqlstmt;

現場例子

桌子

mysql> show create table wflow_report\G
*************************** 1. row ***************************
       Table: wflow_report
Create Table: CREATE TABLE `wflow_report` (
  `organization_id` int(11) NOT NULL DEFAULT '0',
  `candidate_id` int(11) NOT NULL DEFAULT '0',
  `workflow_id` int(11) NOT NULL DEFAULT '0',
  `workflow_name` varchar(200) DEFAULT NULL,
  `orderid` int(11) NOT NULL DEFAULT '0',
  `recorded_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `date_applied` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `delta` int(7) DEFAULT NULL,
  `status` char(1) NOT NULL DEFAULT 'O',
  `hiring_manager` int(11) NOT NULL DEFAULT '0',
  `recruiter` int(11) DEFAULT '0',
  `race` bigint(20) NOT NULL DEFAULT '1',
  `office_id` int(11) NOT NULL DEFAULT '0',
  `department_id` int(11) NOT NULL DEFAULT '0',
  `source_code` varchar(20) DEFAULT NULL,
  KEY `wfreport_officeDept_Idx` (`candidate_id`,`workflow_id`,`office_id`,`department_id`,`organization_id`,`source_code`,`status`),
  KEY `wfreport_RecHM_Idx` (`candidate_id`,`workflow_id`,`recruiter`,`hiring_manager`,`organization_id`,`source_code`,`status`),
  KEY `wfreport_Date_Idx` (`candidate_id`,`recorded_date`,`date_applied`,`workflow_id`,`organization_id`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

查詢形成

SET @mydb = 'resumedirect';
SET @mytb = 'wflow_report';
SET @mynx = 'wfreport_officeDept_Idx';
SET @dbtb = CONCAT(@mydb,'.',@mytb);
SELECT GROUP_CONCAT(column_name)
INTO @IndexColumns
FROM INFORMATION_SCHEMA.STATISTICS
WHERE table_schema=@mydb
AND table_name=@mytb
AND index_name=@mynx;
SELECT CONCAT('SELECT ',@IndexColumns,' FROM ',@dbtb) INTO @sqlstmt;
SELECT @sqlstmt;

輸出

mysql> SET @mydb = 'resumedirect';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @mytb = 'wflow_report';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @mynx = 'wfreport_officeDept_Idx';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @dbtb = CONCAT(@mydb,'.',@mytb);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT GROUP_CONCAT(column_name)
    -> INTO @IndexColumns
    -> FROM INFORMATION_SCHEMA.STATISTICS
    -> WHERE table_schema=@mydb
    -> AND table_name=@mytb
    -> AND index_name=@mynx;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT CONCAT('SELECT ',@IndexColumns,' FROM ',@dbtb) INTO @sqlstmt;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @sqlstmt;
+---------------------------------------------------------------------------------------------------------------------------+
| @sqlstmt                                                                                                                  |
+---------------------------------------------------------------------------------------------------------------------------+
| SELECT candidate_id,workflow_id,office_id,department_id,organization_id,source_code,status FROM resumedirect.wflow_report |
+---------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

我將把它留給您,以添加所需的WHERE子句並在PHP中實現它。

試試看 !!!

試試這樣的東西嗎?

SELECT Name FROM Table WHERE Id='target id'

你可以用一些PHP幫助

    $query = "SHOW INDEX FROM YOURTABLE" ;
    $result = mysqli_query($link, $query);//$link is the connection to mysql
    $count = mysqli_num_row(result);
    //check index
    if(empty($count)){
    $Dataid=array();//no indexes
    }elseif($count==1){//One index
      $row = mysqli_fetch_assoc($result);
      $id = $row['Column_name']; 

      $query_select = "SELECT `$id` FROM `YOURTABLE`";
      $result_select = mysqli_query($link, $query_select);
      while($row_select=  mysqli_fetch_assoc($result_select)){
        $Dataid[]=$row_select;
      }
        echo '<pre>';
        print_r($Dataid);
        echo '</pre>';
  }else{//many indexes
    while($row =  mysqli_fetch_array($result)){
        $Index[]=$row['Column_name'];
      }

    //list all indexes, you can call them by their key($Index[0],$Index[1]...)
    echo '<pre>';
    print_r($Index);
    echo '</pre>';

  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM