【问题标题】:Combine multiple sql tables and multiple sql queries into one statement将多张sql表和多条sql查询合并为一条语句
【发布时间】:2013-03-24 02:46:34
【问题描述】:

我研究过使用join方法,将表连接在一起,但我不仅想连接表,而且查询到一个语句,我不知道如何将查询连接到一个。

我有三张桌子,一张叫friends,一张叫users,一张叫beers。

用户表:

名称 |身份证

好友表:

用户ID |朋友姓名

啤酒桌:

用户ID |啤酒

我想找到给定用户的所有朋友,并查询每个用户和朋友拥有的独特啤酒的计数。

以前我使用 php 来“构建”要执行的 sql 语句,这会在循环中进行大量 sql 调用,而且很混乱。我知道必须有一种更有效的方法来做到这一点。

【问题讨论】:

  • 朋友有他们的on id还是只有与userid关联的名字?
  • 在朋友表中只有他们的名字,我需要他们从用户表中的 id 来从啤酒表中获取他们的啤酒数量,因为它只有他们的 id
  • 那么您需要一种将朋友与用户关联的方法,因为现在您的架构中没有这种方法
  • 如果我将朋友 id 添加到朋友表中会很好吗?
  • 朋友也是用户吗?

标签: php mysql


【解决方案1】:

工作示例:http://sqlfiddle.com/#!2/f1fdd/9

构建架构:

CREATE TABLE user(
  id int(11),
  name varchar(50)
);
CREATE TABLE userFriends(
  userID int(11),
  friendID int(11)
);
CREATE TABLE beer(
  beerID int(11),
  beerName varchar(50)
);
CREATE TABLE friendBeer(
  userID int(11),
  beerID int(11)
);
INSERT INTO user(id,name) VALUES(1,'friend 1');
INSERT INTO user(id,name) VALUES(2,'friend 2');
INSERT INTO user(id,name) VALUES(3,'friend 3');
INSERT INTO user(id,name) VALUES(4,'jeremy');

INSERT INTO userFriends(userID,friendID) VALUES(4,1);
INSERT INTO userFriends(userID,friendID) VALUES(4,2);
INSERT INTO userFriends(userID,friendID) VALUES(4,3);

INSERT INTO beer(beerID, beerName) VALUES(1, 'amstel light');
INSERT INTO beer(beerID, beerName) VALUES(2, 'bud light');
INSERT INTO beer(beerID, beerName) VALUES(3, 'miller');

INSERT INTO friendBeer(userID, beerID) VALUES(1, 1);
INSERT INTO friendBeer(userID, beerID) VALUES(2, 2);
INSERT INTO friendBeer(userID, beerID) VALUES(3, 3);
INSERT INTO friendBeer(userID, beerID) VALUES(4, 1);
INSERT INTO friendBeer(userID, beerID) VALUES(1, 3);

还有查询:

SELECT U.id,
       U.name,
       (SELECT count(beerID)
        FROM friendBeer 
        WHERE userID = 4) AS "user beer count",
       U2.name AS 'Friends name',
       COUNT(FB2.beerID)
FROM user U
LEFT JOIN userFriends F
  ON U.id = F.userID
LEFT JOIN user U2
  ON F.friendID = U2.id
LEFT JOIN friendBeer FB2
  ON F.friendID = FB2.userID
LEFT JOIN friendBeer FB
  ON U.id = FB.userID
WHERE U.id = 4
GROUP BY F.friendID, U.id

我假设您将 =1 更改为 UserID 是什么 - 但这向您展示了查询是如何工作的。

【讨论】:

  • 很棒,有帮助,但它看起来不包括我正在检查的朋友的用户。
  • @peterm ...这只是一个仓促的错误...但感谢您的链接
  • 我没有得到我想要的结果。我想要每个用户的总啤酒量。我为每个用户获得相同的号码。
  • Define "user" then ... 因为我们只为该查询中的一个用户(从用户表)提取结果。
【解决方案2】:
create table user(user_id int(11),user_name varchar(100));
create table friend(user_id int(11),friend_to int(11));
create table beer(user_id int(11),beer_name varchar(100));

insert into user values(1,'Evan');
insert into user values(2,'Mike');
insert into user values(3,'Roxetta');
insert into user values(4,'Rajesh');

insert into friend values(1,2);
insert into friend values(1,3);

insert into beer values(1,'sam bud');
insert into beer values(2,'carlsberg');
insert into beer values(2,'sam bud');
insert into beer values(2,'sam bud');

和sql查询

SELECT user.user_name, COUNT(DISTINCT(beer.beer_name)) `count` FROM beer JOIN `user` ON user.user_id=beer.user_id WHERE user.user_id=1
UNION
SELECT user.user_name,COUNT(DISTINCT(beer.beer_name)) FROM beer JOIN `user` ON user.user_id=beer.user_id 
WHERE user.user_id IN(SELECT friend_to FROM friend WHERE user_id=1);

这是你要找的吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多