我无法解决这个问题。
我将如何在MySQL中执行此操作?
我有2个表,一个包含产品,另一个包含与用户链接的产品列表。
如果用户已将产品链接到他们,请仅从产品表中选择这些产品。 如果用户没有链接到他们的任何产品,请选择所有产品。
我尝试过各种各样的选择,但我似乎无法让它发挥作用:(
修改的
表结构:
Products:
| Supplier | partnumber | price |
|------------|--------------|---------|
| 1 | 1b | 4.00 |
| 4 | 13-f | 12.00 |
|____________|______________|_________|
Lists
| userid | partnumber |
|------------|--------------|
| 37 | 1b |
|____________|______________|
查询应仅选择标识为1b
的产品。
拥有其他ID的用户应同时选择1b
和13-f
编辑2
userid存储在PHP会话中,因此users表不应该相关!
答案 0 :(得分:2)
您可以将存在行的部分合并到用户没有产品的部分:
select
u.UserId,
p.ProductId,
p.ProductName
from
Users u
inner join UserProducts up on up.UserId = u.UserId
inner join Products p on p.ProductId = up.ProductId
union all
select
u.UserId,
p.ProductId,
p.ProductName
from
Users u
cross join Products p
where
not exists (select 'x' from UserProducts up where up.UserId = u.UserId)
您也可以使用左连接代替not exists
。有人说这在MySQL中更快,但它取决于具体情况:
select
u.UserId,
p.ProductId,
p.ProductName
from
Users u
inner join UserProducts up on up.UserId = u.UserId
inner join Products p on p.ProductId = up.ProductId
union all
select
u.UserId,
p.ProductId,
p.ProductName
from
Users u
cross join Products p
left join UserProducts up on up.UserId = u.UserId
where
up.UserId is null
无论哪种方式,查询看起来都很大,因为它们实际上是两个连接在一起的查询。但是因此它的可读性和合理性也很快。 Union all
几乎不会产生任何开销。
由于您的添加建议您已经拥有一个用户ID,因此您的查询可能如下所示:
select
p.ProductId,
p.ProductName
from
UserProducts up
inner join Products p on p.ProductId = up.ProductId
where
up.UserId = <YOURUSERID>
union all
select
p.ProductId,
p.ProductName
from
Products
where
not exists (select 'x' from UserProducts up where up.UserId = <YOURUSERID>)
答案 1 :(得分:1)
以下是一种使用union all
的方法:
select u.*, up.productid
from users u join
userproducts p
on u.userid = up.userid
union all
select u.*, p.productid
from users u cross join
products p
where not exists (select 1 from userproducts up2 where up2.userid = u.userid);
编辑:
如果您只想找一个用户ID,我建议:
select p.*
from userproducts up join
products p
on up.productid = p.productid and
u.userid = $userid
union all
select p.*
from products p
where not exists (select 1 from userproducts up2 where up2.userid = $userid);