【问题标题】:Select comma separated records from table along with user image从表中选择逗号分隔的记录以及用户图像
【发布时间】:2013-03-06 12:07:29
【问题描述】:

表: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有在线用户记录,users表有用户和好友的数据,ID用逗号隔开。

我想根据 users 表的 friends 列从 frei_session 表中检索数据。

前任

如果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

【问题讨论】:

  • 这是因为每个accountid, username 使用MIN 而不是MAX 的frei_session 中的重复值将为您提供您正在寻找的输出:like this。对吗?

标签: php mysql sql join


【解决方案1】:

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

【讨论】:

  • 你是个天才。我无语。非常感谢您的回答。
  • JW 当我使用accountId = 50 时。它不工作sqlfiddle.com/#!2/763ce/19
  • 是的,因为在frei_session 中没有accountid50 的朋友)的状态为0。请注意,他的朋友是49,52,51,44
  • 试试a.accountID = 51 会有一个结果。
【解决方案2】:

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

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

【讨论】:

  • 没问题。我相信阅读这些文章对您的帮助不仅仅是解决方法。
猜你喜欢
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
相关资源
最近更新 更多