条件1上的MYSQL连接在条件2上连接

时间:2014-03-26 20:07:19

标签: php mysql

我有两张桌子,我希望JOIN一张另一张。 JOIN工作正常,但我返回了两条记录。这是(查看我的查询)正确,但我需要根据条件返回两个记录中的一个。可以使用单个查询管理吗?

oc_order_product

product_id | name  | quantity | order_id | store_url
51         | prod1 | 1        | 17       | http://www.opencarttest.com/
48         | prod2 | 3        | 17       | http://www.opencarttest.com/

product

oc_product_id | price | store_url
51            | 50.00 | http://www.opencarttest.com/
51            | 89.95 | 
48            | 15.00 | 

我当前的查询:

SELECT
  oop.product_id,
  oop.name,
  oop.quantity,
  p.price,
  p.store_url
FROM
  oc_order_product AS oop
JOIN
  product AS p
ON
  p.oc_product_id = oop.product_id
WHERE
  oop.order_id='17' AND oop.store_url='http://www.opencarttest.com/'

返回:

product_id | name  | price | store_url
51         | prod1 | 50.00 | http://www.opencarttest.com/
51         | prod1 | 89.95 | 
48         | prod2 | 15.00 |

但我只需要这个:

product_id | name  | price | store_url
51         | prod1 | 50.00 | http://www.opencarttest.com/
48         | prod2 | 15.00 |

我只需要一个与oc_product_id匹配的产品的结果。但它可以是两种产品之一。我需要store_url等于oc_order_product.store_url的产品,或者没有store_url的产品。

编辑:添加了斜杠

5 个答案:

答案 0 :(得分:2)

更新了 - 我假设字段是空字符串而不是NULL

感谢@ aleks-g,因为我偷了他的SQLFiddle进行此代码测试

这是一种方法 - 使用LEFT JOIN和COALESCES

SELECT
  oop.product_id,
  oop.name,
  oop.quantity,
  COALESCE(p_filled.price, p.price) AS price,
  COALESCE(p_filled.store_url, p.store_url) AS store_url
FROM oc_order_product AS oop
LEFT JOIN product AS p_filled
ON p_filled.oc_product_id = oop.product_id
  AND oop.store_url= p_filled.store_url
LEFT JOIN product AS p
ON p.oc_product_id = oop.product_id
  AND COALESCE(p_filled.store_url,'') = ''
WHERE
  oop.order_id='17' AND oop.store_url='http://www.opencarttest.com';

答案 1 :(得分:2)

这将为您提供所需的信息,但会牺牲性能:

SELECT
  oop.product_id,
  oop.name,
  oop.quantity,
  p.price,
  p.store_url
FROM
  oc_order_product AS oop
JOIN
  product AS p
ON
  p.oc_product_id = oop.product_id
  and
  (p.store_url = oop.store_url
   or
   not exists (select 1 from product where oc_product_id=p.oc_product_id and store_url is not null)
  )
WHERE
  oop.order_id='17' AND oop.store_url='http://www.opencarttest.com'

这是sqlfiddle

请注意,根据问题中显示的特定数据,这不起作用 - 您自己的查询也不会 - 因为您在一个表中使用了带有尾部斜杠的URL而在另一个表中没有它。在我的例子中,我删除了所有地方的尾部斜杠。

答案 2 :(得分:2)

您可以在查询中使用mysql变量来记录产品ID的出现,并使用CASE您可以检查产品是否有url或产品没有重复然后选择它,查询中的某些列只是为了详细说明工作

SELECT
  oop.product_id,
  oop.name,
  oop.quantity,
  p.price,
  p.store_url,
(CASE when @test=oop.product_id then 'repeated'
else 'new' end) occurance,
(CASE when p.store_url =oop.store_url OR @test!=oop.product_id
 then 'has'
else 'none' end) url,
@test:=oop.product_id `testvar`
FROM
  oc_order_product AS oop
join (SELECT @test:=0) t
JOIN
  (SELECT * FROM product ORDER BY store_url DESC) AS p
ON
  p.oc_product_id = oop.product_id
WHERE
  oop.order_id='17' 
HAVING url='has'

Fiddle Demo

答案 3 :(得分:0)

$rs = $db->Select('products p, products_images pi','p.*,image_id',"p.product_id=pi.product_id","product_id=$a1");

答案 4 :(得分:-1)

这是另一种方法,不需要子查询:

SELECT
  oop.product_id,
  oop.name,
  oop.quantity,
  IFNULL(p1.price, p2.price),
  p1.store_url
FROM
  oc_order_product AS oop
LEFT JOIN
  product AS p1
ON
  p1.oc_product_id = oop.product_id AND p1.store_url = oop.store_url
LEFT JOIN
  product AS p2
ON
  p2.oc_product_id = oop.product_id
WHERE
  oop.order_id='17'
  AND oop.store_url='http://www.opencarttest.com/'
  AND p1.oc_product_id IS NOT NULL OR p2.oc_product_id IS NOT NULL