mysql选择哪里限制,加入哪里

208*_*083 5 php mysql sql join

我有两个MySQL表

  • 产品(product_id,名称,类别)
  • products_sizes(product_id,size)

每种产品都可以有多种尺寸

我需要进行查询

  1. 根据类别和尺寸选择产品(如果设置了尺寸) - 例如category ='shoes'和size ='10'
  2. 它必须仍然返回产品的所有尺寸,但前提是产品具有特定尺寸的尺寸
  3. 它必须同时将产品的结果限制为具有偏移量的特定数量

我现在的查询如下.我工作,但不限制类别,只返回指定的一个尺寸(这里'10') - 我需要所有尺寸,但只适用于其尺寸'10'的产品...

SELECT products.*
     , products_sizes.*
FROM (
   SELECT *
   FROM products 
   LIMIT $limit OFFSET $offset
   ) AS products
LEFT JOIN products_sizes 
   ON products.products_id = products_sizes.products_id 
WHERE products_sizes.size = 10
Run Code Online (Sandbox Code Playgroud)

...如果我添加WHERE category ='something'查询什么都不返回...

SELECT products.*
     , products_sizes.*
FROM (
   SELECT * 
   FROM products 
   WHERE category = 'shoes' 
   LIMIT $limit OFFSET $offset
   ) AS products
LEFT JOIN products_sizes 
   ON products.products_id = products_sizes.products_id
WHERE products_sizes.size = 10
Run Code Online (Sandbox Code Playgroud)

??

更新:越来越近了......

看完答案后,我现在有了这个:

SELECT *
FROM products AS p 
LEFT JOIN products_sizes AS s 
    ON p.product_id = s.product_id
    WHERE s.product_id 
        IN (SELECT product_id FROM s WHERE size = 10)
    AND p.category = 'shoes'
Run Code Online (Sandbox Code Playgroud)

它满足了我最初的问题的前两个要求:

  1. 返回受类别和大小约束的结果
  2. 如果其中一个尺寸等于指定尺寸,则返回每个产品的所有尺寸

...但我仍然需要将结果限制为一定数量的产品.如果我在查询的最后添加LIMIT $ limit,它将限制返回的大小数量而不是产品数量...感谢输入.

Bel*_*Bob 1

主查询中的子句WHERE违背了您的目的LEFT JOIN,使其与INNER JOIN. 您的派生表很可能没有选择任何匹配的行(尺码为 10 的鞋子)。

除非您的数据有某些内容未显示,否则您可以尝试以下操作:

SELECT products.*
     , products_sizes.*
FROM products 
JOIN products_sizes 
   ON products.products_id = products_sizes.products_id
WHERE products.category = 'shoes' 
   AND products_sizes.size = 10
LIMIT $limit OFFSET $offset
Run Code Online (Sandbox Code Playgroud)