Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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 - Fatal编程技术网

Mysql 一个关系查询,不确定如何使用它来构建

Mysql 一个关系查询,不确定如何使用它来构建,mysql,Mysql,这是目前我的表结构的一种更简单的形式。我有一个产品Id列表,我需要检查用户是否有产品Id,通过查看购物车属于用户的购物车产品,我知道,如上所述的关系。如果他有,我应该检索那个用户和他包含的信息。但我还需要检查产品的价格范围,即产品不得低于500,即cart_产品中的价格栏 我如何构建这个sql?我正在考虑连接和EXISTS或IN的一些用法?您想要这样的东西吗 carts id user_id cart_proucts id cart_id product_id price products

这是目前我的表结构的一种更简单的形式。我有一个产品Id列表,我需要检查用户是否有产品Id,通过查看购物车属于用户的购物车产品,我知道,如上所述的关系。如果他有,我应该检索那个用户和他包含的信息。但我还需要检查产品的价格范围,即产品不得低于500,即cart_产品中的价格栏


我如何构建这个sql?我正在考虑连接和EXISTS或IN的一些用法?

您想要这样的东西吗

carts
id user_id

cart_proucts
id cart_id product_id price

products
much details about the product...
或将IN与子查询一起使用:

SELECT DISTINCT Users.* FROM Users
INNER JOIN carts on carts.user_id = Users.id
INNER JOIN cart_products on carts.id = carts_products.cart_id
WHERE cart_products.price > X and cart_products.price < Y
AND cart_products.product_id IN (LIST OF PRODUCT IDS TO INCLUDE)
AND cart_products.product_id NOT IN (LIST OF PRODUCT IDS TO EXCLUDE)
我认为第一个选项可能会稍微优化一些,但完全有可能通过查询计划器对它们进行优化,使其保持一致。你必须运行一些基准来确定

==编辑2===

那么现在我想你是在要求一个十字路口

SELECT u.* from Users u WHERE u.id IN 
(
    SELECT Users.id FROM Users 
    INNER JOIN carts on carts.user_id = Users.id
    INNER JOIN cart_products on carts.id = carts_products.cart_id
    WHERE cart_products.price > X and cart_products.price < Y
    AND cart_products.product_id IN (LIST OF PRODUCT IDS)
)
我想这也可能和

SELECT DISTINCT Users.* FROM Users
INNER JOIN carts on carts.user_id = Users.id
INNER JOIN cart_products on carts.id = carts_products.cart_id
WHERE cart_products.price > X and cart_products.price < Y
AND cart_products.product_id IN (LIST OF PRODUCT IDS TO INCLUDE)

INTERSECT

SELECT DISTINCT Users.* FROM Users
INNER JOIN carts on carts.user_id = Users.id
INNER JOIN cart_products on carts.id = carts_products.cart_id
WHERE cart_products.price > X and cart_products.price < Y
AND cart_products.product_id NOT IN (LIST OF PRODUCT IDS TO EXCLUDE)
不确定哪些SQL实现允许除外连接,但另一种方法是使用左连接,如下所述:

==编辑3===

SELECT DISTINCT Users.* FROM Users
INNER JOIN carts on carts.user_id = Users.id
INNER JOIN cart_products on carts.id = carts_products.cart_id
WHERE cart_products.price > X and cart_products.price < Y
AND cart_products.product_id IN (LIST OF PRODUCT IDS TO INCLUDE)

EXCEPT

SELECT DISTINCT Users.* FROM Users
INNER JOIN carts on carts.user_id = Users.id
INNER JOIN cart_products on carts.id = carts_products.cart_id
WHERE cart_products.price > X and cart_products.price < Y
AND cart_products.product_id IN (LIST OF PRODUCT IDS TO EXCLUDE)

使用LEFT JOIN+WHERE products.id不为空不需要加入产品-carts_产品在itI中有价格我不太明白他问题的最后一部分tho:产品不得低于500,即cart_产品中的价格列可以工作,但是我得到了我认为应该得到的多个结果,但是,是否有可能存储每个购物车,而不是因为购物车产品中有多个产品而返回10个相同购物车id的结果。因为我真正想要的是,如果用户在他的购物车中实际有它,就返回,而不是实际的购物车本身。第一个几乎是完美的,但是我也尝试不添加,但是用户还是返回了,假设用户有购物车产品。产品id有4和5,如果他两个都有,我不想返回给他选择不同的用户。*从用户内部加入carts on carts.id=users.id内部加入carts on carts.id=cart_products.cart_id WHERE users.total_sum>200和cart_products.product_id在4和cart_products.product_id不在5我不确定我是否理解你?也许你可以用额外的细节来编辑你的问题?听起来你想使用UNION、INTERSECT和EXCEPT,但我不确定你到底想要什么:看看我如何执行一个只从cart_产品中获取cart_id的查询,其中cart_id为5而不是product_id为4,如果我可以执行该查询,我可以简单地拆分上面的查询。。。因此,假设它有一行包含5,这很好,但如果它也有一行包含乘积_id 4,我们不要抓住它,这是一个包含2个子查询和联接的繁重查询。我建议通过将条件移动到内部联接来优化此查询,以便具有错误价格/id的产品不会包含在临时联接表中,临时联接表随后将通过WHERE条件:内部联接cart\u products ON cart\u products.cart\u id=carts.id和cart\u products.price>X和cart\u products.priceSELECT DISTINCT Users.* FROM Users INNER JOIN carts on carts.user_id = Users.id INNER JOIN cart_products on carts.id = carts_products.cart_id WHERE cart_products.price > X and cart_products.price < Y AND cart_products.product_id IN (LIST OF PRODUCT IDS TO INCLUDE) EXCEPT SELECT DISTINCT Users.* FROM Users INNER JOIN carts on carts.user_id = Users.id INNER JOIN cart_products on carts.id = carts_products.cart_id WHERE cart_products.price > X and cart_products.price < Y AND cart_products.product_id IN (LIST OF PRODUCT IDS TO EXCLUDE)
SELECT u.* from Users u WHERE u.id IN 
(
    SELECT Users.id FROM Users 
    INNER JOIN carts on carts.user_id = Users.id
    INNER JOIN cart_products on carts.id = carts_products.cart_id
    WHERE cart_products.price > X and cart_products.price < Y
    AND cart_products.product_id IN (LIST OF PRODUCT IDS TO INCLUDE)
)
AND u.id NOT IN
(
    SELECT Users.id FROM Users 
    INNER JOIN carts on carts.user_id = Users.id
    INNER JOIN cart_products on carts.id = carts_products.cart_id
    WHERE cart_products.price > X and cart_products.price < Y
    AND cart_products.product_id IN (LIST OF PRODUCT IDS TO EXCLUDE)
) 
SELECT *
FROM `users` `u`
JOIN `carts` `c` ON (`u`.`id` = `c`.`user_id`)
JOIN `cart_products` `cp` ON (`cp`.`cart_id` = `c`.`id`)
JOIN `products` `p` ON (`p`.`id` = `cp`.`product_id` AND `p`.`price` > `cp`.`price`)
WHERE `p`.`id` IN (...);