Php 如何在不手动执行的情况下从查询中删除重复连接?
从程序中的不同变量收集查询的不同部分,形成最终查询Php 如何在不手动执行的情况下从查询中删除重复连接?,php,mysql,sql,Php,Mysql,Sql,从程序中的不同变量收集查询的不同部分,形成最终查询 $start= "SELECT co.name FROM common co"; $fjoin=""; $qwhere= "WHERE fruit=banana"; IF ($fruits==1) { $fjoin.= "INNER JOIN fruits fu ON fu.number = co.number"; } IF ($apple==1) { $fjoin.= "INNER JOIN fruits fu ON fu.number =
$start= "SELECT co.name FROM common co";
$fjoin="";
$qwhere= "WHERE fruit=banana";
IF ($fruits==1)
{
$fjoin.= "INNER JOIN fruits fu ON fu.number = co.number";
}
IF ($apple==1)
{
$fjoin.= "INNER JOIN fruits fu ON fu.number = co.number";
}
IF ($banana==1)
{
$fjoin.= "LEFT OUTER JOIN banana ba ON ba.pack = fu.pack";
}
$all=$start.$fjoin.$qwhere;
因此,当程序运行时,$all=从普通co内部连接水果中选择co.name fu上的fu.number=co.number内部连接水果fu上的fu.number=co.number左外部连接香蕉ba上的ba.pack=fu.pack其中水果=香蕉
如果用户选择水果$fruit变为1,如果用户选择香蕉$banana变为1,如果用户选择苹果$apple变为1,则会给用户三个选项:水果、香蕉和苹果。用户可以选择水果和香蕉,也可以选择水果香蕉和苹果。当用户选择所有选项时,如上所示,$all具有重复的内部联接(fu.number=co.number上的内部联接是重复联接)。如何在变量$all的最终查询中检查重复联接并将其删除。有人知道如何识别重复连接并删除它们吗
我使用了$fjoin=introde('internaljoin',array_unique(explode('internaljoin',$fjoin));要删除重复的内部联接,但上面的命令无法在fu.number=co.number上分离内部联接,因此在ba.pack=fu.pack上显示未找到重复项:(
我想在每次连接后添加一个逗号,然后使用以下语句$fjoin=inpolde(“”,array_unique(explode(‘,’,$fjoin)));这可能行得通,但我的程序中有太多的JOIN语句,无法返回并添加逗号,因此我想知道是否有一种方法可以使用一些简单的删除重复连接命令来实现这一点。这里的主要问题是您的条件错误。您正在设置变量,而不是对其求值 您有
if($fruits=1)
,它总是将$fruits
的值设置为1
,因此条件总是true
。使用=
计算变量是否等于该值
您可以在此处阅读有关PHP比较运算符的更多信息:
编辑:我在这里添加了一个备选方案,因为您已经更正了您的问题
将联接存储在数组中,然后使用array\u unique()
删除重复项:
$joins = array();
if ($fruits == 1) {
$joins[] = "INNER JOIN fruits fu ON fu.number = co.number";
}
if ($apple == 1) {
$joins[] = "INNER JOIN fruits fu ON fu.number = co.number";
}
if ($banana == 1) {
$joins[] = "LEFT OUTER JOIN banana ba ON ba.pack = fu.pack";
}
$joins = array_unique($joins);
如果所有条件均为true,则生成的数组将删除重复项,如下所示:
Array
(
[0] => INNER JOIN fruits fu ON fu.number = co.number
[2] => LEFT OUTER JOIN banana ba ON ba.pack = fu.pack
)
这就是我处理这类事情的方式。我为可能的联接表创建一个映射数组,其中键是表的名称。我进行映射,这样就不会重新键入联接,从而减少键入错误的机会。然后我从该映射中收集一个联接数组。因为它们在集合数组中具有相同的键,所以它们不能是dded两次。最后,我将集合数组内爆为字符串
$start= "SELECT co.name FROM common co";
$qwhere= "WHERE fruit=banana";
$map = array(
'fruits'=>"INNER JOIN fruits fu ON fu.number = co.number",
'banana'=>"LEFT OUTER JOIN banana ba ON ba.pack = fu.pack"
);
$joins = array();
if($fruit==1) {
$joins['fruits'] = $map['fruits'];
}
if($apple==1) {
$joins['fruits'] = $map['fruits'];
}
if($banana==1) {
$joins['banana'] = $map['banana'];
}
$all = $start . (implode(" ", $joins)) . $qwhere;
我又回到了我的想法,在每次连接之后添加一个标记“|”,然后使用这个语句$fjoin=infrade(“”,array_unique(explode(“|,$fjoin));它成功了。谢谢大家!太明显了,我一定错过了什么:)
为什么用+代替?存储在数组中而不是字符串中,在最后生成最终查询之前对其调用
array\u unique
。@Gunner,我是说。刚刚编辑it@Wrikken我使用了$fjoin=introde('internaljoin',array_unique(explode('internaljoin',$fjoin));要删除重复的内部连接,但上面的命令无法在fu.number=co.number上分离内部连接,因此在ba.pack=fu.pack上左外部连接香蕉ba,因此它表示未找到重复项:(这就是为什么我将存储在数组中而不是字符串中。以后不要将其撬开返回到数组中。(您可以这样做,但这是不确定的。原因是您应该在拆分字符串中添加1个尾随空格(可能是(“内部连接”
),1个字符的差异,甚至空格,在这一点上都很重要)。但这可能仍然不起作用,因为您的连接
条件中似乎没有尾随空格。这与问题无关。这只是简化示例中的拼写错误。然后他需要从问题中删除拼写错误。计算if($fruits=1)
将导致他正面临的问题-重复联接。哦,我明白了。是的,他的输入错误确实意味着所有联接都将一直添加,目前每次都会导致重复。但是如果在我的解决方案或Wrikken的解决方案中有相同的输入错误,则不会导致重复,只会导致不需要的额外联接。这就是为什么我的大脑认为这是离题的。对不起。
if ($fruits == 1 || $apple == 1)
{
$fjoin.= "INNER JOIN fruits fu ON fu.number = co.number";
}
if ($banana == 1) {
fjoin .= "LEFT OUTER JOIN banana ba ON ba.pack = fu.pack";
}