Mysql 如何获取两个查询的公共结果?

Mysql 如何获取两个查询的公共结果?,mysql,sql,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 * F

假设我有两个类似这样的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);
在显示结果时,我尝试比较pidan自动递增主键,如果

if($r1['pid]==$r2['pid])
{
/* display the contents */
}
但很明显,这不起作用,因为如果pid不相等,则不显示任何内容,而且两者都不会以相同的速度递增,r1的下一个pid结果可能是23,而r2的pid结果将只有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
r2返回这个

pid  company       color

5    logitech      red
6    compaq        red
7    microsoft     red
13   nvidia        red
从以上结果我们可以看出,r1和r2中都存在pid 5、6、7,如何显示这些pid的所有列通常使用INTERSECT完成。但是MySQL不支持INTERSECT,所以必须使用JOIN

从表1 a中选择*,其中公司=“$company”内部联接 从表1中选择*,其中a.pid=b.pid上的颜色='$color'b

当然,如果您的案例非常简单,您可以添加WHERE子句

从表1 a中选择*,其中公司=“$company”和颜色=“$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);
通常这是用INTERSECT完成的。但是MySQL不支持INTERSECT,所以必须使用JOIN

从表1 a中选择*,其中公司=“$company”内部联接 从表1中选择*,其中a.pid=b.pid上的颜色='$color'b

当然,如果您的案例非常简单,您可以添加WHERE子句

从表1 a中选择*,其中公司=“$company”和颜色=“$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);

您正在查找此查询吗

SELECT *
FROM TABLE1 a
WHERE ('$company' = '' or company='$company') and
      ('$color' = '' or color='$color');

您正在查找此查询吗

SELECT *
FROM TABLE1 a
WHERE ('$company' = '' or company='$company') and
      ('$color' = '' or color='$color');

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

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

请注意,通过反转在…(中使用的常用方式,您可以用最少的代码捕获忽略如果为空逻辑。

如果您的应用程序变量在未赋值时为空,您可以使用此简单但优雅的查询,将这两个条件和所有应用程序逻辑测试结合起来:

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

请注意,如何通过颠倒您在…,中使用的通常方式。。。,您可以用最少的代码捕获ignore if blank逻辑。

您的代码中有许多带有和符号的语法错误。您可以用预期结果显示一个数据示例吗?好的,我现在就这样做。问题中的代码不清楚$color和$company在插入查询之前是否已正确转义。如果他们没有,你需要这样做,否则,你很容易受到SQL注入黑客攻击。你的变量是空还是空字符串?你的代码中有很多语法错误和“符号”。你能用你预期的结果显示数据的例子吗?好的,我现在就不做了。在插入到查询中之前进行了转义。如果它们没有,你需要这样做,否则你会受到SQL注入攻击的影响。你的变量是空的还是空的空字符串?老实说,我没有想到这么远。多谢了,老实说,我没想到这么远。谢谢,是的,这是更好的方式,因为我试图简单地提出我的问题,我将使用至少7个变量,你真的缩短了代码。是的,这是更好的方式,因为我试图简单地提出我的问题,我将使用至少7个变量,你真的缩短了代码。