SQL查询构建

时间:2010-10-15 06:45:11

标签: mysql sql database building

我只是在构建SQL查询时感到困惑。我试图成功运行它,但我无法整体构建它。

情况就是这样:在表'userseaches'中,用户Rushi被搜索了三次不同的searchID('searchtable'中的主键)10,11,12。当我用searchID 10搜索时,我获得了110个结果,其中11个获得了112个,12个获得了115个结果。

现在我要做的是搜索ID 11和12(最近两次搜索),即112和115,并获取在上次搜索中新添加的用户的用户名(112),即三个用户。 / p>

我用小件试过这件事,但很难整体制作。请随时询问详情。

提前谢谢。

以下是3个表格:  表mastersearches有字段:

ID  Name   srchtime

  1  aron   22:10:10

  2  rushi  12:12:14

表用户搜索字段:

ID  masterID  Name  nooffriends
1      2      rushi  110   
2      2      rushi  112
3      2      rushi  115

表格搜索表包含字段:

ID  searchID Name   friends
1     2       mike    25
2     2       paine   51 
.
112   2       kumar   87
113   3       bandy   23
 .
227   3       ganua    15   

确定。

现在我想为searchID 3获取三个新添加的用户。

现在我尝试了这个(我通过此查询搜索了两个ID):

select
    Name 
from
    usersearches
where
    searchID in (11, 12)

给了所有粉丝:

但它无法获取新添加的朋友。

3 个答案:

答案 0 :(得分:2)

我的第一个建议是重新设计你的表格结构。您不应该在mastersarches和userssarches中都有这个名字。这导致您必须在两个位置更改名称。查询时的名称应来自一个位置而不是两个位置。我没有看到表用户搜索的目的。它为什么存在?它包含可以从master和searchtable派生的信息,我相信。

其次,你不应该计算你在搜索表中手动输入的朋友。这通常会带来额外的工作来统计这一点。要么以编程方式对其进行分解,要么将其设置为公式,例如:

SELECT m.*, f.Name as 'Friends_Name', count(s.searchID) as 'Friends'
FROM searchtable f
left join searchtable s
on f.ID = f.Id
left join mastersearches m
on s.searchID = m.ID
group by f.ID

现在,我们需要在朋友进入表格时添加一个字段到搜索表来存储,我选择lastmodified作为我的字段。

SELECT m.ID, m.Name, f.Name as 'Friends_Name', count(s.searchID) as 'Friends'
FROM searchtable f
left join searchtable s
on f.ID = f.Id
left join mastersearches m
on s.searchID = m.ID
where m.srchtime < s.lastmodified
group by f.ID

如果您需要任何进一步的帮助,请告诉我。 您应该注意,“朋友”计数显示在每一行上,但反映的是主姓名而不是搜索表名称。

以下是使用他的模型创建表格的代码。

DROP TABLE IF EXISTS `stack overflow`.`mastersearches`;
CREATE TABLE  `stack overflow`.`mastersearches` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Name` text NOT NULL,
  `srchtime` time NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `stack overflow`.`searchtable`;
CREATE TABLE  `stack overflow`.`searchtable` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `searchID` text NOT NULL,
  `Name` text NOT NULL,
  `friends` int(10) unsigned NOT NULL,
  `lastModified` time NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=228 DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `stack overflow`.`usersearches`;
CREATE TABLE  `stack overflow`.`usersearches` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `masterID` int(10) unsigned NOT NULL,
  `Name` text NOT NULL,
  `nooffriends` int(10) unsigned NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

答案 1 :(得分:0)

你的问题令人困惑。 “朋友”和“追随者”在您的背景下是否相同?如果是这样,那么试试这个

Select TOP 2
    Name 
from
    usersearches
where
    searchID in (11, 12) ORDER BY ID DESC

仅当ID是连续的时才会起作用。

另外,您提供了2个表“usersearches”和“searchtable”...这些表是如何相关的?

答案 2 :(得分:0)

尝试:

select Name 
from usersearches
where searchID in (11, 12)
group by name
having min(searchID) = 12