Sql запрос здания - PullRequest
       3

Sql запрос здания

1 голос
/ 15 октября 2010

Я просто запутался в построении SQL-запроса.Я пытался успешно запустить его по частям, но я не смог собрать его целиком.

Это тот случай: в таблице 'userseaches' пользователь Rushi трижды подвергался поиску с разными идентификаторами searchID (первичный ключ в 'searchtable') 10, 11, 12.Когда я искал с помощью searchID 10, я получил 110 результатов, с 11 - 112, а с 12 - 115.

Теперь мне нужно выполнить поиск по идентификаторам 11 и 12 (два последних поиска), т.е.112 и 115, и получение имен пользователей, которые были добавлены в последний поиск (112), то есть трех пользователей.

Я пробовал это с небольшими кусочками, но трудно сделать это в целом.Пожалуйста, не стесняйтесь спрашивать подробности.

Заранее спасибо.

Хорошо, ниже приведены 3 таблицы: мастер-таблицы поиска с полями:

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   

ок.

Теперь я хочу просто выбрать трех новых пользователей для идентификатора поиска 3.

Теперь я попробовал с этим(Я получил два идентификатора с поисковыми запросами по этому запросу):

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

дал всех подписчиков:

Но он не может получить новых добавленных друзей.

Ответы [ 3 ]

2 голосов
/ 15 октября 2010

Мое первое предложение - изменить структуру таблицы. Вы не должны иметь имя как в mastersearches, так и в 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

Теперь нам нужно добавить поле в таблицу поиска для хранения, когда друг был введен в таблицу, в качестве поля я выбрал 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;
0 голосов
/ 15 октября 2010

Попробуйте:

select Name 
from usersearches
where searchID in (11, 12)
group by name
having min(searchID) = 12
0 голосов
/ 15 октября 2010

Ваш вопрос сбивает с толку. Являются ли "Друзья" и "Последователи" одинаковыми в вашем контексте? Если это так, попробуйте это

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

Это будет работать, только если идентификатор является последовательным.

Кроме того, вы предоставили 2 таблицы "usersearches" и "searchtable" ... как эти таблицы связаны?

...