从mySql中的条目名称返回表父名

时间:2016-10-29 10:21:03

标签: mysql

我在MySql中有一个包含多个表的数据库,我试图弄清楚如何基本搜索一个条目并返回包含该条目的所有表。我不需要整个桌子,只需要TABLE_NAME。

目前我在index.php中有这个:

$query = mysql_query("SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='maps'") or die(mysql_error());

然后我想创建另一个页面,显示我所描述的表格。 希望你理解我的意思。

EDIT。 哦,所以我想出了这个代码。 我有点做我想要的,但现在我想搜索表中的每一行,而不是表名。

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='maps' AND TABLE_NAME LIKE "%Search term%"

EDIT2。

现在在我的.php文件中,我有以下内容。 '一个'进行测试。

$qu = "set @@group_concat_max_len = 1000000;
set @schema := 'maps';
set @search := '%a%';

set @sql = (
    select group_concat(concat(
        'select distinct \'', c.TABLE_NAME, '\' as table_name, ',
        '\'', c.COLUMN_NAME, '\' as column_name ',
        'from `', @schema, '`.`', c.TABLE_NAME, 
        '` where `', c.COLUMN_NAME, '` like \'', @search , '\''
    ) separator ' union all ')
    from information_schema.`COLUMNS` c
    where c.TABLE_SCHEMA = @schema
);
prepare stmt from @sql;
execute stmt;"
$query = mysql_query($qu) or die(mysql_error());

                <?php
                    while($row = mysql_fetch_array($query))
                    {
                        $f1 = $row['TABLE_NAME'];
                        $f2 = $row['TABLE_NAME'];
                ?>
                <tr>
                    <td><a href="#"><?php echo $f1 ?></a></td>
                    <td><?php echo $f2 ?></td>
                </tr>

如果你能提供帮助意味着很多,你已经解决了它,但我对此很新,所以我不确定如何实现它,对不起。

1 个答案:

答案 0 :(得分:1)

您可以动态构建预准备语句。

set @@group_concat_max_len = 1000000;
set @schema := 'maps';
set @search := '%Search term%';

set @sql = (
    select group_concat(concat(
        'select distinct \'', c.TABLE_NAME, '\' as table_name, ',
        '\'', c.COLUMN_NAME, '\' as column_name ',
        'from `', @schema, '`.`', c.TABLE_NAME, 
        '` where `', c.COLUMN_NAME, '` like \'', @search , '\''
    ) separator ' union all ')
    from information_schema.`COLUMNS` c
    where c.TABLE_SCHEMA = @schema
);

prepare stmt from @sql;
execute stmt;

构建的语句将搜索&#39;%搜索词%&#39;在每个表的每一列中,为包含搜索字词的每列返回table_namecolumn_name

您还可以使用PHP构建相同的查询:

$schema = 'maps';
$search = '%Search term%';

$query1 = "
    select TABLE_NAME, COLUMN_NAME
    from information_schema.`COLUMNS`
    where c.TABLE_SCHEMA = {$schema}
";

$result1 mysql_query($query1);
$queryParts = array();
while($row = mysql_fetch_assoc($result1)) {
    $table  = $row['TABLE_NAME'];
    $column = $row['COLUMN_NAME'];
    $queryPart = "
        select distinct '{$table}' as table_name, '{$column}' as column_name
        from `{$schema}`.`{$table}`
        where `{$column}` like '{$search}'
    ";
    $queryParts[] = $queryPart;
}
$unionQuery = implode(' union all ', $queryParts);

$result2 = mysql_query($unionQuery);
while($row = mysql_fetch_assoc($result2)) {
    echo $row['table_name'] . '.' . $row['column_name'] . '<br>';
}

注意:创建的查询可能非常慢。

注意2:只要不太晚,你应该从mysql-extention切换到mysqli或更好地切换到PDO