0

私は2つのテーブルを持っています:

  • 友達テーブル(UserIDFriendID)と

  • ユーザーテーブル(UserID、、FirstNameLastName

UserID1つのSQLクエリを実行して、またはFriendIDinside friendsテーブルがユーザーのIDと等しいすべてのレコードを結合してプルしようとしていますが、他のレコードからFirstNameとをプルしています。LastNameUserID

例えば

友達テーブル

UserID = 1 | FriendID = 2
UserID = 3 | FriendID = 1

ユーザーテーブル

UserID = 1 | FirstName = "Bob"  | LastName = "Hope"

UserID = 2 | FirstName = "John" | LastName = "Doe"

UserID = 3 | FirstName = "Bill" | LastName = "Murray"

Bob(= 1)としてログインしている場合、 1がaであるか、friendsテーブル内にあるかを確認して、1つのクエリですべての友達ユーザーデータ(および)をUserID取得しようとしています。次に、私のIDではない反対のフィールドのデータを結合します。FirstNameLastNameUserIDFriendIDUserID

何か案は?

4

3 に答える 3

1

あなたの質問を理解できれば、これでうまくいきます

-- set the id of the logged in user
set @logged_in = 1;

-- select all the fields from the user table
select users.* from users
-- joined the friends table on the `FriendID`
inner join friends on friends.FriendID = users.UserID
-- filtered by `UserID` on friends table matching logged in user
and friends.UserID = @logged_in -- logged in id
-- union-ed with the users table
union select * from users
-- filtered by the `UserID` being the logged in user
where users.UserID = @logged_in -- logged in id

@logged_in = 1 の結果:

UserID  FirstName   LastName
2       John        Doe
1       Bob         Hope

@logged_in = 2 の結果:

UserID  FirstName   LastName
2       John        Doe

テスト データベース作成コード:

--
-- Table structure for table `friends`
--

CREATE TABLE IF NOT EXISTS `friends` (
  `UserID` int(11) NOT NULL,
  `FriendID` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `friends`
--

INSERT INTO `friends` (`UserID`, `FriendID`) VALUES
(1, 2),
(3, 1);

-- --------------------------------------------------------

--
-- Table structure for table `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `UserID` int(11) NOT NULL,
  `FirstName` varchar(50) NOT NULL,
  `LastName` varchar(50) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `users`
--

INSERT INTO `users` (`UserID`, `FirstName`, `LastName`) VALUES
(1, 'Bob', 'Hope'),
(2, 'John', 'Doe'),
(3, 'Bill', 'Murray');
于 2013-01-20T09:14:43.740 に答える
1

これを試して:

SELECT *
FROM users u
WHERE userid IN ( SELECT userid FROM friends WHERE friendid = 1
                  UNION ALL
                  SELECT friendid FROM firends WHERE userid = 1);

これにより、次のことが得られます。

| USERID | FIRSTNAME | LASTNAME |
---------------------------------
|      2 |      John |      Doe |
|      3 |      Bill |   Murray |

SQL フィドルのデモ

于 2013-01-20T09:14:48.763 に答える
1
Select b.uid as userid, a.firstname, a.lastname 
from user a
Inner join (select friendid as uid from friends where userid=:currentUser
Union select userid as uid from friends where friendid=:currentUser) b

電話では、構文の微調整が必​​要になる場合があります。

オプティマイザーは、実際のデータに基づいて異なる結合戦略を提案する場合があります

于 2013-01-20T09:16:08.307 に答える