Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中的“条件联接”(条件下的不同联接)_Mysql_Sql_Join_Inner Join - Fatal编程技术网

MySQL中的“条件联接”(条件下的不同联接)

MySQL中的“条件联接”(条件下的不同联接),mysql,sql,join,inner-join,Mysql,Sql,Join,Inner Join,我们有两张桌子: 产品和商店 一家商店基本上可以有很多产品。我们从products表中进行选择,但我们将其内部连接到stores表,以便我们只选择来自当前处于“活动”状态的商店的产品 但是,我们只希望在不是店主查看给定产品的情况下发生这种行为 因此,本质上我想做的是创建一个查询,我们可以向查询提供当前登录的用户id,并对stores表进行连接。如果提供的用户_id与stores表中的匹配,那么它就是商店所有者-我们应该允许他们查看产品[这将基本上与不同的条件连接]。如果用户id与stores表中

我们有两张桌子:

产品和商店

一家商店基本上可以有很多产品。我们从products表中进行选择,但我们将其内部连接到stores表,以便我们只选择来自当前处于“活动”状态的商店的产品

但是,我们只希望在不是店主查看给定产品的情况下发生这种行为

因此,本质上我想做的是创建一个查询,我们可以向查询提供当前登录的用户id,并对stores表进行连接。如果提供的用户_id与stores表中的匹配,那么它就是商店所有者-我们应该允许他们查看产品[这将基本上与不同的条件连接]。如果用户id与stores表中的不同,则该用户是普通用户,不应允许查看产品

以下是我的两个问题:

店主


基本上,如果可能的话,我想将它们合并到一个查询中。

两个内部联接就可以了

SELECT products.* from products
INNER JOIN stores
ON stores.id = products.store_id
AND (stores.user_id = <supplied userid> OR stores.is_active = 1)
SELECT products.* from products
INNER JOIN stores owners_store ON ( owners_store.id = products.store_id AND owners_store.user_id = <supplied userid> )
INNER JOIN stores user_stores ON ( user_stores.id = products.store_id AND user_stores.is_active = 1 )

两个内部连接应该可以实现这一点

SELECT products.* from products
INNER JOIN stores owners_store ON ( owners_store.id = products.store_id AND owners_store.user_id = <supplied userid> )
INNER JOIN stores user_stores ON ( user_stores.id = products.store_id AND user_stores.is_active = 1 )

这两个表有什么索引?对不同的记录使用UNION ALL或UNION可以更好地利用任何索引。您将使用更多的代码,您可能会得到更好的查询计划。更详细地说,在联合查询中,可以在is\u active和user\u id上使用索引,使用或不使用这两个索引的查询只执行表扫描。在一个数据集上,这个例子的大小是无关紧要的,在一个更大的数据集中,这可能会产生显著的差异。因此,如果发现ID只看到他的项目,或者看到他的+所有其他?所有+其他基本上,这两个表上有哪些索引?对不同的记录使用UNION ALL或UNION可以更好地利用任何索引。您将使用更多的代码,您可能会得到更好的查询计划。更详细地说,在联合查询中,可以在is\u active和user\u id上使用索引,使用或不使用这两个索引的查询只执行表扫描。在一个数据集上,这个例子的大小是无关紧要的,在一个更大的数据集中,这可能会产生显著的差异。因此,如果发现ID只看到他的项目,或者看到他的+所有其他?所有+其他基本上,这将返回活动存储以及供应商乐于帮助!我只是用了你询问的逻辑。这真的很简单:这将把活跃的商店也返回给供应商,并乐于提供帮助!我只是用了你询问的逻辑。其实很简单:
SELECT products.* from products
INNER JOIN stores owners_store ON ( owners_store.id = products.store_id AND owners_store.user_id = <supplied userid> )
INNER JOIN stores user_stores ON ( user_stores.id = products.store_id AND user_stores.is_active = 1 )