1

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

情况是这样的:在表 'userseaches' 中,用户 Rushi 已使用不同的 searchID('searchtable' 中的主键) 10, 11, 12 被搜索了 3 次。当我使用 searchID 10 进行搜索时,我得到了 110 个结果,11 得到了 112 个结果,而 12 我得到了 115 个结果。

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

我用小块试过这个,但很难把它做成一个整体。请随时询问详情。

先感谢您。

好的,下面是 3 个表:具有字段的表 mastersearches:

ID  Name   srchtime

  1  aron   22:10:10

  2  rushi  12:12:14

表 usersearches 具有字段:

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)

给了所有的追随者:

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

4

3 回答 3

2

我的第一个建议是重新设计您的表结构。您不应该在 mastersearches 和 usersearches 中都有该名称。这导致您必须在两个地方更改名称。查询时的名称应该来自一个位置,而不是两个位置。我没有看到表 usersearches 的用途。它为什么存在?我相信它包含可以从 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

现在,我们需要在 searchtable 中添加一个字段来存储当朋友进入表时,我选择 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;
于 2010-10-15T10:32:37.993 回答
0

尝试:

select Name 
from usersearches
where searchID in (11, 12)
group by name
having min(searchID) = 12
于 2010-10-15T13:53:01.997 回答
0

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

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

这仅在 ID 是连续的时才有效。

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

于 2010-10-15T07:48:46.603 回答