1

SQLクエリの作成に混乱しています。うまく分割して実行しようとしましたが、全体としてビルドすることはできませんでした。

たとえば、テーブル「userseaches」では、ユーザー Rushi が異なる searchID (「searchtable」の主キー) 10、11、12 で 3 回検索されています。searchID 10 で検索すると 110 件、11 で 112 件、12 で 115 件の結果が得られました。

ここで私がしなければならないことは、ID の 11 と 12 (最新の 2 つの検索)、つまり 112 と 115 の検索を取得し、最後の検索 (112) で新しく追加されたユーザー (3 人のユーザー) のユーザー名を取得することです。

小さいものでやってみましたが、全体で作るのは難しいです。詳細はお気軽にお尋ねください。

前もって感謝します。

以下は3つのテーブルです:フィールドを持つテーブルマスターサーチ:

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 に対して新しく追加された 3 人のユーザーを取得したいと思います。

今、私はこれを試しました(このクエリで検索して2つのIDを取得しました):

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

すべてのフォロワーに与えました:

しかし、新しく追加された友達を取得することはできません。

4

3 に答える 3

2

私の最初の提案は、テーブル構造を再設計することです。マスターサーチとユーザーサーチの両方に名前を含めるべきではありません。この結果、両方の場所で名前を変更する必要があります。照会時の名前は、両方ではなく 1 つの場所から取得する必要があります。テーブル usersearches の目的がわかりません。なぜそれが存在するのですか?マスターと検索可能から派生できる情報が含まれていると思います。

第二に、検索テーブルに手動で入力している友人を数える必要はありません。これにより、これを集計する際に余分な作業が発生することがよくあります。プログラムで因数分解するか、次のような式として設定します。

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

さらにサポートが必要な場合は、お知らせください。「Friends」の数は各行に表示されますが、検索可能な名前ではなくマスター名を反映していることに注意してください。

彼のモデルを使用して作成したテーブルを作成するコードを次に示します。

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 TOP 2
    Name 
from
    usersearches
where
    searchID in (11, 12) ORDER BY ID DESC

これは、ID が連続している場合にのみ機能します。

また、「usersearches」と「searchtable」の 2 つのテーブルを提供しましたが、これらのテーブルはどのように関連していますか?

于 2010-10-15T07:48:46.603 に答える
0

試す:

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