考虑以下SQL
SHOW INDEX FROM table1
这将打印出用作table1索引的列名。
我想知道是否可以在另一个查询中嵌入这样的查找,例如:
SELECT (index column names on table1) FROM table1 WHERE ...
有没有办法选择这些列名用于这样的查询?
答案 0 :(得分:2)
由于您不能子查询SHOW
(请参阅SubQueries了解子查询中允许的语句),请使用两个查询:
//获取列
$ 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 ...”);
答案 1 :(得分:0)
您可以按照建议的几个阶段执行此操作,因为您可以使用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似乎至少不想处理此查询。
<强>文档强>
答案 2 :(得分:0)
为了回答这个问题,我将使用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中实现它。
答案 3 :(得分:-1)
尝试这样的事情吗?
SELECT Name FROM Table WHERE Id='target id'
答案 4 :(得分:-1)
你可以通过一些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>';
}