0

我正在尝试为此表构建选择,但我得到了奇怪的结果。我的桌子:

tbl_main
–––––––––––––––––-
id  user_id     name

tbl_friends
–––––––––––––––––-
id  user_id     main_id people

tbl_cats
–––––––––––––––––-
id  user_id     main_id

现在我只知道 user_id。我想获得这些项目的结果(数组):

  • 我需要来自 tbl_main 的 id 列表(结果应按此 tbl_main.id DESC 排序)
  • 当 tbl_friends.user_id=user_id AND tbl_friends.main_id=tbl_main.id 时,计算 tbl_friends 中有多少独特的人
  • 当 tbl_friends.user_id=user_id AND tbl_friends.main_id=tbl_main.id 时,从 tbl_friends 获取逗号分隔的人员值列表(或数组)
  • 当 tbl_cats.main_id = tbl_main.id 时计算 tbl_cats.user_id 的唯一值

这应该是一个查询的结果。我正在尝试许多 COUNT(DISTINCT) 组合,但它不起作用,我完全迷失了。请帮忙。非常感谢

我尝试了这样的事情(见下文)。结果似乎还可以,但它是正确的方法吗(一个查询中选择 3 个)?那么服务器负载呢?它适用于大数据吗?

SELECT e.id
  (SELECT GROUP_CONCAT(DISTINCT ef.people) FROM tbl_friends ef WHERE ef.user_id=$user_id AND ef.main_id=e.id) as result_people, 
  (SELECT COUNT(DISTINCT et.user_id) FROM tbl_cats et WHERE et.main_id=e.id) as total

FROM tbl_main e
WHERE e.user_id = $user_id
ORDER BY e.id DESC
4

1 回答 1

0

我不确定我是否理解您要执行的操作,但这应该返回与您当前查询相同的结果,并且比两个标量相关子查询更有效 -

SELECT
    tm.id,
    GROUP_CONCAT(DISTINCT tf.people) AS result_people,
    COUNT(DISTINCT tc.user_id) AS total
FROM tbl_main tm
LEFT JOIN tbl_friends tf
    ON tm.id = tf.main_id
    AND tm.user_id = tf.user_id
LEFT JOIN tbl_cats tc
    ON tm.id = tc.main_id
WHERE tm.user_id = $user_id
GROUP BY tm.id DESC

比较两个查询的 EXPLAIN 输出,看看它们的表现如何。

于 2012-04-09T00:42:17.483 回答