Php 选择带有索引的列名
考虑以下SQLPhp 选择带有索引的列名,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' 由于无法子查询显示(有关子查询中允许的语句,请参阅),请使用两个查询: //获
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你先发布答案,当我写我的答案时,我没有看到你的帖子,我看到了…是的,他很生气,因为他发布了非功能代码而报复我们。我知道。。。不合理。事实上,没有。我的意思是你的回答不够解释,更不用说效率低下了。这就是为什么投票被否决。出于礼貌,我会删除它,但我是不被允许的,所以如果一个国防部读到这个,请删除否决票。或者如果你编辑你的答案。谢谢