如果行存在,则为JOIN,否则为SELECT

时间:2014-06-12 11:11:51

标签: mysql sql

我无法解决这个问题。

我将如何在MySQL中执行此操作?

我有2个表,一个包含产品,另一个包含与用户链接的产品列表。

如果用户已将产品链接到他们,请仅从产品表中选择这些产品。 如果用户没有链接到他们的任何产品,请选择所有产品。

我尝试过各种各样的选择,但我似乎无法让它发挥作用:(

修改
表结构:

Products:
|  Supplier  |  partnumber  |  price  |
|------------|--------------|---------|
|      1     |      1b      |   4.00  |
|      4     |      13-f    |  12.00  |
|____________|______________|_________|


Lists
|   userid   |  partnumber  |
|------------|--------------|
|      37    |      1b      |
|____________|______________|

查询应仅选择标识为1b的产品。

拥有其他ID的用户应同时选择1b13-f

编辑2

userid存储在PHP会话中,因此users表不应该相关!

2 个答案:

答案 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);