Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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
Php 选择带有索引的列名_Php_Mysql - Fatal编程技术网

Php 选择带有索引的列名

Php 选择带有索引的列名,php,mysql,Php,Mysql,考虑以下SQL SHOW INDEX FROM table1 这将打印出用作表1索引的列名 我想知道是否可以在另一个查询中嵌入这样的查找,例如: SELECT (index column names on table1) FROM table1 WHERE ... 有没有办法选择这些列名以便在这样的查询中使用?试试类似的方法 SELECT Name FROM Table WHERE Id='target id' 由于无法子查询显示(有关子查询中允许的语句,请参阅),请使用两个查询: //获

考虑以下SQL

SHOW INDEX FROM table1
这将打印出用作表1索引的列名

我想知道是否可以在另一个查询中嵌入这样的查找,例如:

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

有没有办法选择这些列名以便在这样的查询中使用?

试试类似的方法

SELECT Name FROM Table WHERE Id='target id'

由于无法子查询
显示
(有关子查询中允许的语句,请参阅),请使用两个查询:

//获取列
$q=mysql_查询(“从表中显示索引”)

//使用列
$result=mysql_查询(“SELECT”.mysql_结果($q,0,'Column_name')。“来自表…”)

为了安全起见,您应该检查是否有索引,并决定在有多个索引的情况下使用哪个索引

 //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的第二个参数选择索引,如下所示:

//选择索引编号2
$result=mysql_查询(“SELECT”.mysql_结果($q,1,,'Column_name'),“来自表…”)


您可以通过一些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>';

  }
$query=“从您的表中显示索引”;
$result=mysqli\u查询($link,$query)//$link是到mysql的连接
$count=mysqli\u num\u行(结果);
//检查索引
如果(空($count)){
$Dataid=array();//没有索引
}elseif($count==1){//一个索引
$row=mysqli\u fetch\u assoc($result);
$id=$row['Column_name'];
$query\u select=“从“YOURTABLE”中选择“$id”;
$result\u select=mysqli\u query($link,$query\u select);
while($row\u select=mysqli\u fetch\u assoc($result\u select)){
$Dataid[]=$row\u select;
}
回声';
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;
打印(数据标识); 回声';
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;
}else{//许多索引 while($row=mysqli\u fetch\u数组($result)){ $Index[]=$row['Column_name']; } //列出所有索引,您可以通过它们的键调用它们($Index[0],$Index[1]…) 回声';
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;
打印(索引); 回声';
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;
}
您可以按照建议分几个阶段完成这项工作,因为您可以使用PHP编写脚本。您还可以通过使用
information\u schema
表和准备好的语句,仅使用一个查询(例如,从命令行)来完成此操作,如下所示:

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;
当然,这需要查询用户对信息模式表和目标表都有权限

下面是一个小例子:

要在PHP中实现这一点,您必须将其分解为其他答案中建议的步骤;如果作为单个字符串传递,PDO至少似乎不希望处理此查询

文档

  • MySQL准备的语句-
  • MySQL用户定义变量-
  • MySQL信息架构表-

    • 为了回答这个问题,我将使用
      mydb.mytable

      首先,一个表可以有多个索引

      您可以从中找到表的所有索引

      您必须从
      mydb.mytable
      中选择所需的索引

      假设索引名为
      myindex

      接下来需要的是创建一个以逗号分隔的列名列表的函数。将所有这些放在一起,您应该能够像这样精心设计查询:

      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;
      
      实例 桌子 查询表单 输出 我将留给您附加所需的WHERE子句,并在PHP中实现它


      试试看!!!呃,我不明白这个问题。你的第二句话似乎回答了第一句话。你还想了解什么信息?什么意思?是否要从具有索引的(任何)列中获取数据?为什么?我想知道在我的php代码中有索引的列名的名称作为变量。他想从主键列中获取数据,可能事先不知道主键列的名称。我发现情况就是这样。我也试过把它放在变量里,没有骰子。然而,我在文档(甚至博客)中找不到任何提到这一点的内容。你有这方面的消息来源吗?这似乎是未记录的行为。@Chris我记得在MySQL手册的
      SELECT
      或关于子查询的章节中提到,
      SHOW
      查询不能出现在子查询中。子查询中有一些语句是不允许的。@JDuarteDJ第一个查询不返回任何内容。因此,我看到了第二个查询的警告:mysql_result()期望参数1是Resource第一个查询应该返回一些东西,我测试了它,但是是您说
      这将打印出作为表1索引的列名。
      您是否用自己的表名替换了
      ?这个表真的有索引吗?@JDuarteDJ:对不起,这样行得通。我的db连接有问题,对目标用户来说太复杂了。报复dow nvoting通常是不受欢迎的。这不是“报复否决投票”,这在我之前对这个答案的评论中已经解释清楚了!此外,是你“报复否决”了我的一个问题!我不这么认为。“对目标用户来说过于复杂”是荒谬的。那是谁的评估,你的?是谁让你来做这个评估的?谁是“目标用户”?你滥用投票系统是因为你对某事感到愤怒。停下来。@jduartdj你先发布答案,当我写我的答案时,我没有看到你的帖子,我看到了…是的,他很生气,因为他发布了非功能代码而报复我们。我知道。。。不合理。事实上,没有。我的意思是你的回答不够解释,更不用说效率低下了。这就是为什么投票被否决。出于礼貌,我会删除它,但我是不被允许的,所以如果一个国防部读到这个,请删除否决票。或者如果你编辑你的答案。谢谢