从表中选择逗号分隔的记录以及用户图像

时间:2013-03-18 07:55:13

标签: php mysql sql join

表: frei_session

id  username        accountId   status  status_mesg

14  Sumit Bijvani   50          0       I am available
16  Dilip Borad     49          1       I am available
15  Karan Bijvani   51          1       I am available

表:用户

accountId    friends      userImage

49           50,52        49.jpg
50           49,52,51,44  50.jpg
51           50           51.jpg

我有2个表, frei_session 有在线用户记录,用户表中有用户和朋友的数据,用逗号分隔ID。

我想根据用户表的朋友列从 frei_session 表中检索数据。

对于Ex

如果user 49在线,我想要输出,如下所示

id  username        accountId   status  status_mesg        userImage

14  Sumit Bijvani   50          0       I am available     50.jpg

因为用户50和52是用户49的朋友,但现在只有用户50在线

我试过以下查询。但它显示我错误的userImage。

SELECT  b.*, a.userImage
FROM    users a
        INNER JOIN frei_session b
            ON FIND_IN_SET(b.accountID, a.friends) > 0
         INNER JOIN
        (
            SELECT  accountID, username, MAX(id) id
            FROM    frei_session
            GROUP   BY accountID, username
        ) c ON b.accountID = c.accountID AND
                b.username = c.username AND
                b.id = c.id
WHERE   b.status = 0 AND
        a.accountID = 49

SQL Fiddle Demo

2 个答案:

答案 0 :(得分:3)

frei_session的结果是user (a)的朋友,这就是为什么它不包含您朋友的图像,而是您要搜索的用户的图像。因此,为了让您获取朋友形象,您需要将其加入另一个user (d),以便您可以从frei_session表中获取正确的图像。

SELECT  b.*, d.userImage
FROM    users a
        INNER JOIN frei_session b
            ON FIND_IN_SET(b.accountID, a.friends) > 0
         INNER JOIN
        (
            SELECT  accountID, username, MAX(id) id
            FROM    frei_session
            GROUP   BY accountID, username
        ) c ON b.accountID = c.accountID AND
                b.username = c.username AND
                b.id = c.id
        INNER JOIN users d
          ON b.AccountID = d.AccountID
WHERE   b.status = 0 AND
        a.accountID = 49

答案 1 :(得分:2)

通过规范化表格,您可以使用基本的JOIN操作来完成所有这些操作。请查看database normalization,因为您的架构违反了正确数据库设计的所有规则。

  • friends包含多个值,因此违反了该值 第一个正常形式。
  • status_mesg取决于status和 因此违反了第二种正常形式。