2

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

4

3 回答 3

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);
于 2013-09-18T11:48:15.977 回答
1

您在寻找此查询吗?

SELECT *
FROM TABLE1 a
WHERE ('$company' = '' or company='$company') and
      ('$color' = '' or color='$color');
于 2013-09-18T12:01:02.960 回答
1

如果您的应用程序变量在未分配时为空,您可以将这两个条件以及所有应用程序逻辑(在应用程序代码中测试空白)与这个单一、简单但优雅的查询结合起来:

SELECT *
FROM TABLE1
WHERE '$company' IN ('', company)
AND '$color' IN ('', color)

请注意,通过反转您使用的通常方式IN (...),您可以用最少的代码捕获忽略空白逻辑。

于 2013-09-19T03:49:25.600 回答