【问题标题】:Automating UNION Mysql query with php使用 php 自动执行 UNION Mysql 查询
【发布时间】:2012-03-07 09:27:42
【问题描述】:

我不确定我的标题格式是否正确,但这是从这个问题继续 How to do Mysql Union with check if row exists?

我们让 UNION 运行良好并合并了 7 个表,现在的问题是我们希望为用户提供禁用特定表搜索的选项。肯定你猜对了,sql 返回错误,因为如果用户想要我们放在 UNION 中的最后一个表中的数据,我们的 sql 以 UNION 而不是 SELECT 开头,

所以我们创建了返回可用选项数组的多个选择列表 print_r($tables) 返回数组 ( [0] => table_1 [1] => table_2...

foreach ($tables as $key=> $source){
    if($key ==0){
        $UNION='';
    }else{
        $UNION='UNION ';
    }
}

这是完美的,只有数组中的第一个没有得到 UNION 但在 sql 中我们遇到了一个问题,因为我们不能循环相同的查询并且我们不能多次在循环之外获取 $UNION var(例如 global var )。

if (in_array("table_1", $tables)) {
    $sql1 ="".$UNION."SELECT  i.title,i.category,'a' as source FROM table_a  WHERE REGEXP 'news'";
}
if (in_array("table_2", $tables)) {
    $sql2 ="".$UNION."SELECT i.title,i.category, 'b' as source FROM table_b WHERE REGEXP 'news'";
}


$query=$sql1.$sql2;

我们试图通过将 var $UNION 放在数组中并内爆来在 foreach 循环之外获取它,但这也不起作用,例如

foreach ($tables as $key=> $source){
    if($key ==0){
        $UNION='';
    }else{
        $UNION='UNION ';
    }
 $get_union[]=$UNION;
}

if (in_array("table_1", $tables)) {
    $sql1 ="".implode($UNION)."SELECT  i.title,i.category,'a' as source FROM table_a  WHERE REGEXP 'news'";
}
if (in_array("table_2", $tables)) {
    $sql2 ="".implode($UNION)."SELECT i.title,i.category, 'b' as source FROM table_b WHERE REGEXP 'news'";
}

我只是被要求编辑问题所以这是我需要的结果

用户从多个选择列表中选择选项以禁用 table_b 和 table_c 我们的多选选项输出和数组。我需要确保数组中的第一个没有 UNION 作为前缀,然后运行查询。所以是这样的:

$table =array([0]=>table_a,[1]=>table_b,[2]=>table_c);

if($table[0]){
   $UNION='';
}else{
    $UNION='UNION ';
}

if (in_array("table_a", $tables)) {
    $sql1 ="".$UNION."SELECT  i.title,i.category,'a' as source FROM table_a  WHERE REGEXP 'news'";
}
if (in_array("table_b", $tables)) {
    $sql2 ="".$UNION."SELECT i.title,i.category, 'b' as source FROM table_b WHERE REGEXP 'news'";
}
if (in_array("table_c", $tables)) {
    $sql3 ="".$UNION."SELECT i.title,i.category, 'c' as source FROM table_b WHERE REGEXP 'news'";
}

$query=$sql1.$sql2.$sql2;

任何可以提供帮助的勇敢的人都请这样做。谢谢!

【问题讨论】:

  • 我了解您正在尝试构建一个字符串(sql 语句),但我不太明白您想要做什么。您能否使用给定数据集的预期结果字符串更新您的问题?
  • @MostyMostacho 我添加了您要求的信息。现在有意义吗?
  • @Benn:他说给定数据集的预期结果字符串。
  • @David 我想我在第一段中提到过,这是我要输出的 sql 结果,但我看不出这有什么关系,因为我们需要先设置选项才能提交查询数据库。 stackoverflow.com/questions/9299861/…

标签: php mysql


【解决方案1】:

所以你想达到与此类似的结果:

SELECT  i.title,i.category,'a' as source FROM table_a  WHERE REGEXP 'news'
UNION 
SELECT i.title,i.category, 'b' as source FROM table_b WHERE REGEXP 'news'

给定$tables = array('table_a', 'table_b',...);

问题是您没有办法将 'table_a' 与 'a' 匹配(当然,除非这些是您的真实表名,我对此表示严重怀疑)

因此,您需要做的是创建一个 hastable 以将每个表与您要修复的固定值相匹配:

$tablesAndValues = array (
    'table_a'   => 'a',
    'users'     => 'address',
    ...
);

一旦你有了查询,就可以通过这种方式创建:

$sqlArray = array();
for ($tables as $table => $value) {
    $sqlArray[] = "SELECT i.title, i.category, '" . $value . "' as source FROM " . $table . " WHERE REGEXP 'news'";
}

现在让我们内爆数组:

$sql = implode(" UNION ", $sqlArray);

我对 PHP 了解不多,但这应该可以让您了解如何解决它。

【讨论】:

  • thnx 对此,但我的问题不是检索数据,我已经用 UNION 得到了 ti,你的方式更干净但仍然有同样的问题,如果用户希望表单只从特定表中搜索,比如表_b?在将字符串提交到 mysql 之前,我需要 swith。这是 ajax 搜索表单
猜你喜欢
  • 1970-01-01
  • 2014-01-20
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多