假设我有两个类似这样的mysql查询
if(!empty($company))
{
$q1="SELECT * FROM TABLE1 WHERE company='$company'";
}
else
{
$q1="SELECT * FROM TABLE1;
}
$r1=mysqli_query($q1);
if(!empty($color))
{
$q2="SELECT * FROM TABLE1 WHERE color='$color'";
}
else
{
$q2="SELECT * FROM TABLE1;
}
$r2=mysqli_query($q2);
在显示结果时,我尝试比较pid(auto_incrementing主键),如果
if($r1['pid]==$r2['pid])
{
/* display the contents */
}
但显然这不会起作用,如果pid不相等则没有任何显示,而且两者都不会以相同的速度递增,r1的pid的下一个结果可能是23,而在r2中它只会是12,这样就不会显示任何内容。 具有较小结果的查询将使过滤器工作明显,如何在显示结果的while循环的一个循环内设置较小的pid等于较大的pid?如果可以做到这一点,我想我的问题也会解决?
我怎样才能做到这一点?
我只想显示两个查询共有的结果。
PS :这些查询是动态生成的,因此如果$ color或$ company中的任何一个为空,那么将从表格中选择所有内容。
更新 * 示例 *
r1返回此
pid company color
1 acer red
3 hp red
5 logitech red
6 compaq red
7 microsoft red
8 lenovo red
AND r2返回此
pid company color
5 logitech red
6 compaq red
7 microsoft red
13 nvidia red
然后从上面的结果我们看到pid 5,6,7存在于r1和r2中,如何显示关于这些pid的所有列
答案 0 :(得分:2)
通常使用INTERSECT
完成此操作。但是,MySQL不支持INTERSECT
,因此您必须使用JOIN
SELECT * FROM TABLE1 a WHERE company='$company' INNER JOIN
(SELECT * FROM TABLE1 WHERE color='$color') b ON (a.pid = b.pid)
当然,如果您的案例非常简单,您只需添加WHERE子句
即可 SELECT * FROM TABLE1 a WHERE company='$company' AND color='$color'
这是您根据公司或颜色是否被选中动态构建查询的方式:
$q1="SELECT * FROM TABLE1 WHERE 1=1";
if(!empty($company))
{
$q1 .=" AND company='$company'";
}
if(!empty($color))
{
$q1 .=" AND color='$color'";
}
$r=mysqli_query($q1);
答案 1 :(得分:1)
您在寻找此查询吗?
SELECT *
FROM TABLE1 a
WHERE ('$company' = '' or company='$company') and
('$color' = '' or color='$color');
答案 2 :(得分:1)
如果您的应用程序变量在未分配时为空,您可以将这两个条件和结合起来(使用应用程序代码中的空白进行测试),这个简单而优雅的查询:
SELECT *
FROM TABLE1
WHERE '$company' IN ('', company)
AND '$color' IN ('', color)
请注意,通过颠倒使用IN (...)
的常用方法,您可以使用最少的代码捕获ignore-if-blank逻辑。