我不确定我是否格式化了标题,但这是从这个问题继续 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;
任何勇敢的灵魂都可以提供帮助。谢谢!
答案 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知之甚少,但这应该让你知道如何解决它。