2010-10-15 44 views
1

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

这种情况:在'userseaches'表中,用户Rushi已经用不同的searchID(在'searchtable'中的主键)10,11,12搜索了三次。当我用searchID搜索时,我得到了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 

表searchtable具有字段:

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) 

给所有追随者:

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

+0

感谢增加更多的信息,但实际的SQL构造表和一些示例数据会更加有用。 – Tony 2010-10-15 07:37:24

+0

这一节将大家抛出“现在我要做的是,获取ID 11和12(最近两次搜索),即112和115的搜索,并获取最后搜索(112)中新添加的用户的用户名三个用户。“...你想要一个结果还是2个结果? – 2010-10-15 07:42:05

+0

我并没有真正明白你要达到的目标 - 我的印象是你的描述与你的示例数据不符,这使得难以遵循。无论如何,在你的例子中至少有一个错字:你的SELECT在表usersearches中提到了一个列searchID,而你的表描述没有提到这样的列。也许它是'WHERE masterID in'而不是'where'searchID in'? – titanoboa 2010-10-15 08:42:29

回答

0

你的问题很混乱。你的上下文中的“朋友”和“追随者”是否相同?如果是这样,那么试试这个

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

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

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

+0

MySQL中没有'TOP X'。也许你想'LIMIT X' – 2010-10-15 07:54:32

+0

我的坏...没有注意到标签。 – 2010-10-15 08:07:02

+0

不,我需要的是那些通过searchID 12获得的新追随者,但不是11。 – Rishi2686 2010-10-15 09:17:08

2

我的第一个建议是重新设计你的表格结构。你不应该在大师级和用户大会上都有这个名字。这导致你不得不在两个地方更改名称。查询时的名称应该来自一个位置,而不是两个位置。我没有看到桌面用户会议的目的。它为什么存在?它包含可以从主人和可搜索的信息,我相信。其次,你不应该有一个朋友算你是手动进入可搜索。这往往会导致额外的工作。它programmaticly,或设置为一个公式,例如无论因素:

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存储时,朋友被输入到表中,我选择了上次更改为我的领域。

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; 
0

尝试:

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