用php自动化UNION Mysql查询

时间:2012-02-15 23:58:04

标签: php mysql

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

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

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

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

这是完美的,只有数组中的第一个没有得到UNION但是在sql中我们有一个问题,因为我们不能循环相同的查询,我们不能多次获得循环外的$ UNION 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;

任何勇敢的灵魂都可以提供帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

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

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知之甚少,但这应该让你知道如何解决它。