2011-04-02 159 views
0

在這裏,他來混淆他的一天! (從現在起應該是我的手柄)幫助sql選擇語法

我很困惑,非常失落。

我需要弄清楚如何使select語句讓FriendID涉及到有用戶id

enter image description here

enter image description here

正如你可以看到FriendID涉及到我的用戶表的用戶名,所以如果FriendID = 2,則顯示UserID 2的詳細信息。

如果IM用戶ID 1我要顯示我所有的朋友,我的用戶ID由會話設置是林試圖做的,

我需要做的是找出誰是我的朋友都是從這樣選擇FriendID freinds SessionID = UserID那麼一些如何找出在User表中的friendsID屬於誰,並顯示他的名字,第二名和他的圖片路徑。

非常混亂......

我的表結構是這樣的:

enter image description here

所以,概括起來講什麼,我需要在我的選擇命令:

要找出誰我的朋友們(currentsession UserID有FriendID的) 顯示與他自己的用戶ID有關的friendID的名字,姓氏,圖片路徑

實施例:

I(用戶ID = 1)已經FriendID 2 =用戶名2因此選擇姓名,從用戶secondname其中UserID = 2

我可以有壽不知道與我的表結構的關係的問題。

我希望你能理解我的困惑:

編輯對於那些不能看到我的數據庫的圖像

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 

SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 

SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL'; 



CREATE SCHEMA IF NOT EXISTS `gymwebsite2` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ; 

USE `gymwebsite2` ; 



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

-- Table `gymwebsite2`.`User` 

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

CREATE TABLE IF NOT EXISTS `gymwebsite2`.`User` (

    `UserID` INT NOT NULL AUTO_INCREMENT , 

    `Email` VARCHAR(245) NULL , 

    `FirstName` VARCHAR(45) NULL , 

    `SecondName` VARCHAR(45) NULL , 

    `DOB` VARCHAR(45) NULL , 

    `Location` VARCHAR(45) NULL , 

    `Aboutme` VARCHAR(1045) NULL , 

    `username` VARCHAR(45) NULL , 

    `password` VARCHAR(45) NULL , 

    PRIMARY KEY (`UserID`)) 

ENGINE = InnoDB; 





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

-- Table `gymwebsite2`.`WallPosting` 

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

CREATE TABLE IF NOT EXISTS `gymwebsite2`.`WallPosting` (

    `idWallPosting` INT NOT NULL AUTO_INCREMENT , 

    `UserID` INT NOT NULL , 

    `Wallpostings` VARCHAR(2045) NULL , 

    PRIMARY KEY (`idWallPosting`) , 

    INDEX `fk_WallPosting_User` (`UserID` ASC) , 

    CONSTRAINT `fk_WallPosting_User` 

    FOREIGN KEY (`UserID`) 

    REFERENCES `gymwebsite2`.`User` (`UserID`) 

    ON DELETE NO ACTION 

    ON UPDATE NO ACTION) 

ENGINE = InnoDB; 





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

-- Table `gymwebsite2`.`Pictures` 

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

CREATE TABLE IF NOT EXISTS `gymwebsite2`.`Pictures` (

    `idPictures` INT NOT NULL AUTO_INCREMENT , 

    `UserID` INT NOT NULL , 

    `picturepath` VARCHAR(1045) NULL , 

    PRIMARY KEY (`idPictures`) , 

    INDEX `fk_Pictures_User1` (`UserID` ASC) , 

    CONSTRAINT `fk_Pictures_User1` 

    FOREIGN KEY (`UserID`) 

    REFERENCES `gymwebsite2`.`User` (`UserID`) 

    ON DELETE NO ACTION 

    ON UPDATE NO ACTION) 

ENGINE = InnoDB; 





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

-- Table `gymwebsite2`.`Friends` 

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

CREATE TABLE IF NOT EXISTS `gymwebsite2`.`Friends` (

    `idFriends` INT NOT NULL AUTO_INCREMENT , 

    `UserID` INT NOT NULL , 

    `FriendID` INT NOT NULL , 

    PRIMARY KEY (`idFriends`) , 

    INDEX `fk_Friends_User2` (`FriendID` ASC) , 

    INDEX `fk_Friends_User1` (`UserID` ASC) , 

    UNIQUE INDEX `FriendID_UNIQUE` (`FriendID` ASC) , 

    CONSTRAINT `fk_Friends_User2` 

    FOREIGN KEY (`FriendID`) 

    REFERENCES `gymwebsite2`.`User` (`UserID`) 

    ON DELETE NO ACTION 

    ON UPDATE NO ACTION, 

    CONSTRAINT `fk_Friends_User1` 

    FOREIGN KEY (`UserID`) 

    REFERENCES `gymwebsite2`.`User` (`UserID`) 

    ON DELETE NO ACTION 

    ON UPDATE NO ACTION) 

ENGINE = InnoDB; 







SET [email protected]_SQL_MODE; 

SET [email protected]_FOREIGN_KEY_CHECKS; 

SET [email protected]_UNIQUE_CHECKS; 
+0

您的圖像沒有加載。請描述你的表格結構。 – 2011-04-02 17:20:48

+0

哼怪?我將重新編輯一秒 – 2011-04-02 17:22:06

+1

圖像問題已解決。你可以在我的答案中找到解決方案。 – 2011-04-02 17:26:07

回答

2
select u.FirstName, u.SecondName, p.picturePath 
from User u 
join Friends f 
    on f.FriendId = u.UserId 
join Pictures p 
    on p.UserId = u.UserId 
where f.UserId = SessionId (<-- sessionId is your id) 
+0

其他解決方案也正確! – 2011-04-02 17:56:26

+0

請注意,如果不是所有用戶都有圖片,則將圖片上的連接更改爲左連接將是首選。 – ingo 2011-04-03 00:54:35

1

如果我正確理解你的問題和數據模型,你正在嘗試要做的是查詢用戶之間的多對多遞歸關係,這些用戶通過彼此成爲朋友而相互連接(即通過朋友表,其行爲像多對多關係中的相交實體)。

您可以通過查詢與2不同的別名加入用戶表的兩倍,這樣做:

select 
    u2.UserID, 
    u2.FirstName, 
    u2.SecondName, 
    p.picturepath 
from User u1 -- This gets me 
join Friends f on u1.UserID = f.UserID -- This gets my friends 
join User u2 on f.FriendID = u2.UserID -- This gets my friends info 
join Pictures p on p.UserID = u2.UserID -- This gets my friends pics 
where u1.UserID = 1 -- ...or whatever; don't actually hardcode "1"! 
+0

怎麼樣在不同的表中的圖片路徑? – 2011-04-02 17:28:03

+1

@加里斯:對不起,疏忽!已更正 – 2011-04-02 17:34:03

1

這樣做:

SELECT User.*, Pictures.PicturePath 
      FROM (User INNER JOIN Friends 
       ON User.UserId = Friends.FriendId) table 
       INNER JOIN ON table.UserId = Pictures.UserId 
      WHERE Friends.UserId = 1 // this is your id (SessionId) 

這將返回全朋友的信息

1
SELECT u.firstName, u.secondName, p.picturepath 
FROM User as u, Friends as f, Pictures as p 
WHERE f.UserID = $sessionID 
AND u.UserID = f.FriendID 
AND p.UserId = f.FriendID 
+0

從未見過「as」之前:) – 2011-04-02 17:30:42

+1

您想要圖片路徑......您還需要加入「圖片」表格。 'as'是可選的。這是相當古老的學校,我認爲它讀得很好。 – 2011-04-02 17:32:46

+0

是啊抱歉布萊恩你的齋戒回覆一次我注意到我刪除了我的評論,我以爲我看到雙 – 2011-04-02 17:34:02

1
SELECT x.FirstName, 
      x.SecondName, 
      x.Email, 
      z.picturepath 
     FROM (Friends AS x, 
      User AS y 
      ) 
LEFT JOIN Pictures AS z 
     ON x.FriendID = z.UserId 
    WHERE x.UserID = 1 # <- this is determined by the session ID 
     AND x.FriendID = y.UserID 
0
SELECT 
    u.FirstName, 
    u.SecondName, 
    p.picturepath 
FROM User as u 
    INNER JOIN Friends as f 
    ON u.UserId = f.FriendId 
    INNER JOIN Pictures as p 
    ON u.UserId = p.UserId 
WHERE f.UserId = 1