MySQL使用具有多个连接的组_CONCAT

MySQL使用具有多个连接的组_CONCAT,mysql,join,left-join,group-concat,Mysql,Join,Left Join,Group Concat,我有以下四张桌子。我的查询工作正常,但我需要“AUTHORIZED_VIEWER”和“AUTHORIZED_VIEWER_EMAIL”字段返回所有值,而不仅仅是第一个值。我相信这可以通过使用GROUP_CONCAT来实现,但是,我不确定这部分应该如何实现。注意-当尝试使用GROUP_CONCAT时,我必须使用以下语法,因为它返回一个BLOB: 以下是四张表格: users_tbl +-----+------------------+ |id |email | +-

我有以下四张桌子。我的查询工作正常,但我需要“AUTHORIZED_VIEWER”和“AUTHORIZED_VIEWER_EMAIL”字段返回所有值,而不仅仅是第一个值。我相信这可以通过使用GROUP_CONCAT来实现,但是,我不确定这部分应该如何实现。注意-当尝试使用GROUP_CONCAT时,我必须使用以下语法,因为它返回一个BLOB:

以下是四张表格:

users_tbl
+-----+------------------+
|id   |email             |  
+-----+------------------+
|10   | scott@co.com     |
|8    | cesar@co.com     |
|11   | kevin@co.com     |
|12   | jake@co.com      |
+-----+------------------+

authorized_viewers_tbl (authorized_viewer linked to id in users_tbl)
+-----+------------+------------------+
|id   |lightbox_id |authorized_viewer |   
+-----+------------+------------------+
|1    | 50         |11                |
|7    | 50         |8                 |
|3    | 31         |11                |
|5    | 30         |8                 |
|6    | 30         |11                |
|8    | 16         |11                |
|9    | 16         |10                |
|10   | 5          |10                |
|11   | 5          |11                |
+-----+------------+------------------+

lightboxes_tbl
+-----+------------------+---------------+
|id   |lightbox_name     |author         |   
+-----+------------------+---------------+
|5    | Test Lightbox #1 |jake@co.com    |
|16   | Test Lightbox #2 |cesar@co.com   |
|30   | Test Lightbox #3 |scott@co.com   |
|31   | Test Lightbox #4 |kevin@co.com   |
|50   | Test Lightbox #5 |cesar@co.com   |
+-----+------------------+---------------+

lightbox_assets_tbl
+-------+-------------+------------------+------------------=---+----------+
|id     |lightbox_id  |asset_name        |asset_path            | asset_id |
+-------+-------------+------------------+----------------------+----------+
|232    |30           |b757.jpg          |SWFs/b757.jpg         | 3810     |
|230    |31           |b757.jpg          |SWFs/b757.jpg         | 3810     |
|233    |16           |a321_takeoff.jpg  |SWFs/a321_takeoff.jpg | 3809     |
|234    |31           |a321_takeoff.jpg  |SWFs/a321_takeoff.jpg | 3809     |
|235    |50           |a330_landing.png  |SWFs/a330_landing.png | 3789     |
+-------+-------------+------------------+-----------------------+---------+
以下是我当前使用的查询:

SELECT lb.id,
   lb.lightbox_name,
   lb.author,
   avt.authorized_viewer,
   u.email AS authorized_viewer_email,
   COUNT(lba.lightbox_id) total_assets
FROM lightboxes_tbl lb
LEFT JOIN lightbox_assets_tbl lba ON lb.id = lba.lightbox_id
LEFT JOIN authorized_viewers_tbl avt ON avt.lightbox_id = lb.id
LEFT JOIN users_tbl u ON u.id = avt.authorized_viewer
WHERE lb.author = 'scott@co.com'
  OR avt.authorized_viewer =
    (SELECT id
     FROM users_tbl
     WHERE email = 'scott@co.com')
GROUP BY lb.id
ORDER BY lb.lightbox_name ASC

谢谢

[编辑] 基于SQL FIDLE的预期结果:

 +-------+----------------+--------------+-------------------+--------------------------+--------------+
 |id     |lightbox_name   |author        |authorized_viewer  | email                    | total_assets |
 +-------+----------------+--------------+-------------------+--------------------------+--------------+
 |5      |Test Lightbox#1 |jake@co.com   |10,11              |scott@co.com,kevin@co.com |0             |             
 |16     |Test Lightbox#2 |cesar@co.com  |10,11              |scott@co.com,kevin@co.com |1             |
 |30     |Test Lightbox#3 |scott@co.com  |11,8               |kevin@co.com,cesar@co.com |1             |
 +-------+-------------+-----------------+-------------------+--------------------------+--------------+
试试这个:-

SELECT lb.id,
   lb.lightbox_name,
   lb.author,
   avt.authorized_viewer,
   u.email AS authorized_viewer_email,
   COUNT(lba.lightbox_id) total_assets
FROM lightboxes_tbl lb
LEFT JOIN lightbox_assets_tbl lba ON lb.id = lba.lightbox_id
LEFT JOIN authorized_viewers_tbl avt ON avt.lightbox_id = lb.id
LEFT JOIN users_tbl u ON u.id = avt.authorized_viewer
WHERE lb.author = 'scott@co.com'
OR avt.authorized_viewer =
(SELECT id
 FROM users_tbl
 WHERE email = 'scott@co.com')
GROUP BY lb.id, lb.lightbox_name, lb.author, avt.authorized_viewer, u.email
ORDER BY lb.lightbox_name

有一种更干净的方法可以做到这一点,但我还没有时间去思考

这是一个有趣的问题,非常感谢大家的分享,希望我们能帮上忙

  • 我们将
    group\u concat
    添加到
    avt.authorized\u viewer
    u.email
  • 我们将
    distinct
    添加到
    组_concat
    中,以便仅根据请求提取唯一值
  • 我们为每个非聚合值添加了
    groupby
  • 我们修改了where子句,将Scott作为审阅者的所有灯箱都拉进去。通过使用author字段作为限制,我们排除了其他审阅者。通过基于灯箱Id的过滤器,我们保留了所有用户;这允许
    组\u concat
    按需工作

  • 希望这能帮你解决问题!(从基本主题中清除了一些评论,因为我现在已经包含了它们或这里收集的信息。)

    @xQbert这很接近。排在哪scott@co.com'不是作者,而是授权的_查看器,它只是列表scott@co.com. 如果可能的话,我需要它列出所有授权的观众,在哪里scott@co.com是其中之一。这有意义吗?谢谢是的,我认为你的第一次尝试更接近。所以我期待的是任何一个灯箱scott@co.com'是否返回作者,包括所有授权的观众(以及列出的所有其他信息-看起来是正确的)。此外,任何灯箱scott@co.com'是可返回的授权\u查看器,包括其他授权\u查看器。用户可以是作者或授权的_查看器,但不能同时是两者。希望这有帮助。谢谢你的持续帮助。我正看着这把小提琴,它列出了30磅的两项资产——我不知道为什么。不管怎么说,我只是看了你最新的小提琴,我相信它是正确的!!!谢谢你的帮助。如果你想创建一个答案,我会将它标记为正确。好的,我可以复制它。看看这个SQL FIDLE,最后一行-LB#31。A&B列有重复的条目。简单的方法是将distinct添加到group by<代码>组密码(不同的avt.授权的\u查看器)a,组密码(不同的u.电子邮件)b,需要不同的密码。这是因为我们需要lightbox\u assets\u tbl中的双重输入。我绝对不是SQL专家,所以如果有更干净的方法来编写此文件,并且您有时间,我很乐意看到它。再次感谢!!!
    SELECT lb.id,
       lb.lightbox_name,
       lb.author,
       avt.authorized_viewer,
       u.email AS authorized_viewer_email,
       COUNT(lba.lightbox_id) total_assets
    FROM lightboxes_tbl lb
    LEFT JOIN lightbox_assets_tbl lba ON lb.id = lba.lightbox_id
    LEFT JOIN authorized_viewers_tbl avt ON avt.lightbox_id = lb.id
    LEFT JOIN users_tbl u ON u.id = avt.authorized_viewer
    WHERE lb.author = 'scott@co.com'
    OR avt.authorized_viewer =
    (SELECT id
     FROM users_tbl
     WHERE email = 'scott@co.com')
    GROUP BY lb.id, lb.lightbox_name, lb.author, avt.authorized_viewer, u.email
    ORDER BY lb.lightbox_name
    
    SELECT lb.id,
           lb.lightbox_name,
           lb.author,
           group_concat(distinct avt.authorized_viewer) a,
           group_concat(distinct u.email) b,
           COUNT(distinct lba.id) total_assets
    FROM lightboxes_tbl lb
    LEFT JOIN lightbox_assets_tbl lba ON lb.id = lba.lightbox_id
    LEFT JOIN authorized_viewers_tbl avt ON avt.lightbox_id = lb.id
    LEFT JOIN users_tbl u ON u.id = avt.authorized_viewer
    where lb.author = 'scott@co.com'
    or 
    lb.id in (Select lightbox_ID 
              from authorized_Viewers_tbl X
              INNER JOIN users_Tbl U on U.ID = X.authorized_Viewer
              WHERE email = 'scott@co.com')
    GROUP BY lb.id, lb.lightbox_name, lb.author
    ORDER BY lb.lightbox_name ASC