如何获取两个查询的常见结果?

时间:2013-09-18 11:42:02

标签: mysql sql

假设我有两个类似这样的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的所有列

3 个答案:

答案 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逻辑。