如何将两个 sql 查询合并为一个具有可变限制的查询
How to merge two sql queries into one with variable limit
我有两个表:
user_favourites -> id, user_id, product_id
product -> id, title, bought
我需要显示 9 个结果 -> 用户收藏加上其他产品(如果用户收藏少于 9 个)。
所以在我的页面上应该显示 9 个产品。如果用户选择了 9 个最喜欢的产品,那么我将显示这 9 个最喜欢的产品,如果他选择了少于 9 个(至少 5 个),那么我必须显示他最喜欢的 5 个加上系统中评分最高的 4 个产品。
要获取用户收藏夹,我有以下查询:
select product_id from user_favourites where user_id = $userId
要获得最高评价的产品,我有以下查询:
select id, title, count(bought) from product group by id limit 9
因此,如果用户未选择 9,我想显示第一个最喜欢的产品 + 最受欢迎的产品,我能否以某种方式将这两个查询合并为一个以获得所需的结果?请不要在这里出现问题,我需要删除重复项。如果用户选择了 id 为 999 的产品,但他也是最受欢迎的产品之一,我只需要显示一次。我还需要获得最多 9 个结果。
使用 php 和 mysql 最优雅的方法是什么?
我会去参加:
select P.id, P.title, P.bought
from product as P
left join user_favourites as UF on(P.id=UF.product_id)
where UF.user_id=$user_id OR UF.user_id IS NULL
order by user_id DESC
limit 9;;;
假设在 product
table 中每个产品有 1 行并且购买的是一个整数,而不是 group by
似乎建议的每个买家 1 行
这里是a fiddle
略微扩展 dirluca 的优秀作品
create table product
(
id int not null auto_increment primary key, -- as per op question and assumption
title varchar(255) not null,
bought int not null -- bought count assumption, denormalized but who cares for now
);
create table user_favourites
(
id int not null auto_increment primary key, -- as per op question and assumption
user_id int not null,
product_id int not null,
unique index (user_id,product_id)
-- FK RI left for developer
);
insert into product (title,bought) values ('He Bought 666',10),('hgdh',9),('dfhghd',800),('66dfhdf6',2),('He Bought this popular thing',900),('dfgh666',11);
insert into product (title,bought) values ('Rolling Stones',20),('hgdh',29),('4dfhghd',100),('366dfhdf6',2),('3dfghdgh666',0),('The Smiths',16);
insert into product (title,bought) values ('pork',123),('and',11),('beans',16),('tea',2),('fish',-9999),('kittens',13);
insert into user_favourites (user_id,product_id) values (1,1),(1,5);
select P.id, P.title, P.bought,
( CASE
WHEN uf.user_id IS NULL THEN 0 ELSE -1 END
) AS ordering
from product as P
left join user_favourites as UF on(P.id=UF.product_id)
where UF.user_id=1 OR UF.user_id IS NULL
order by ordering,bought desc
limit 9;
-- 在 gui
中输入时自然忽略排序列
id title bought ordering
5 He Bought this popular thing 900 -1
1 He Bought 666 10 -1
3 dfhghd 800 0
13 pork 123 0
9 4dfhghd 100 0
8 hgdh 29 0
7 Rolling Stones 20 0
12 The Smiths 16 0
15 beans 16 0
我有两个表:
user_favourites -> id, user_id, product_id
product -> id, title, bought
我需要显示 9 个结果 -> 用户收藏加上其他产品(如果用户收藏少于 9 个)。
所以在我的页面上应该显示 9 个产品。如果用户选择了 9 个最喜欢的产品,那么我将显示这 9 个最喜欢的产品,如果他选择了少于 9 个(至少 5 个),那么我必须显示他最喜欢的 5 个加上系统中评分最高的 4 个产品。
要获取用户收藏夹,我有以下查询:
select product_id from user_favourites where user_id = $userId
要获得最高评价的产品,我有以下查询:
select id, title, count(bought) from product group by id limit 9
因此,如果用户未选择 9,我想显示第一个最喜欢的产品 + 最受欢迎的产品,我能否以某种方式将这两个查询合并为一个以获得所需的结果?请不要在这里出现问题,我需要删除重复项。如果用户选择了 id 为 999 的产品,但他也是最受欢迎的产品之一,我只需要显示一次。我还需要获得最多 9 个结果。
使用 php 和 mysql 最优雅的方法是什么?
我会去参加:
select P.id, P.title, P.bought
from product as P
left join user_favourites as UF on(P.id=UF.product_id)
where UF.user_id=$user_id OR UF.user_id IS NULL
order by user_id DESC
limit 9;;;
假设在 product
table 中每个产品有 1 行并且购买的是一个整数,而不是 group by
似乎建议的每个买家 1 行
这里是a fiddle
略微扩展 dirluca 的优秀作品
create table product
(
id int not null auto_increment primary key, -- as per op question and assumption
title varchar(255) not null,
bought int not null -- bought count assumption, denormalized but who cares for now
);
create table user_favourites
(
id int not null auto_increment primary key, -- as per op question and assumption
user_id int not null,
product_id int not null,
unique index (user_id,product_id)
-- FK RI left for developer
);
insert into product (title,bought) values ('He Bought 666',10),('hgdh',9),('dfhghd',800),('66dfhdf6',2),('He Bought this popular thing',900),('dfgh666',11);
insert into product (title,bought) values ('Rolling Stones',20),('hgdh',29),('4dfhghd',100),('366dfhdf6',2),('3dfghdgh666',0),('The Smiths',16);
insert into product (title,bought) values ('pork',123),('and',11),('beans',16),('tea',2),('fish',-9999),('kittens',13);
insert into user_favourites (user_id,product_id) values (1,1),(1,5);
select P.id, P.title, P.bought,
( CASE
WHEN uf.user_id IS NULL THEN 0 ELSE -1 END
) AS ordering
from product as P
left join user_favourites as UF on(P.id=UF.product_id)
where UF.user_id=1 OR UF.user_id IS NULL
order by ordering,bought desc
limit 9;
-- 在 gui
中输入时自然忽略排序列id title bought ordering
5 He Bought this popular thing 900 -1
1 He Bought 666 10 -1
3 dfhghd 800 0
13 pork 123 0
9 4dfhghd 100 0
8 hgdh 29 0
7 Rolling Stones 20 0
12 The Smiths 16 0
15 beans 16 0