我有两张桌子,我希望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的产品。
编辑:添加了斜杠
答案 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'
答案 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