mysql找不到正确的选择查询

时间:2012-04-08 22:08:29

标签: mysql

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

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和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

1 个答案:

答案 0 :(得分: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输出,看看它们是如何运作的。