2012-04-08 2 views
0

Я пытаюсь построить select для этой таблицы, но получаю странные результаты. Мои столы:mysql не может найти правильный запрос выбора

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 (результаты должны быть отсортированы по этому tbl_main.id DESC)
  • подсчета, сколько уникальных людей в tbl_friends когда tbl_friends.user_id = user_id И tbl_friends.main_id = tbl_main.id
  • получить запятую список (или массив) значений людей из tbl_friends когда tbl_friends.user_id = user_id И tbl_friends.main_id = tbl_main.id
  • количества уникальных значений tbl_cats.user_id, когда tbl_cats.main_id = tbl_main.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 
+2

Я пробовал что-то вроде: SELECT e.id, ef.people, COUNT (DISTINCT ef.people) AS countpeople, COUNT (DISTINCT ef.people) + COUNT (DISTINCT e.user_id) AS total, COUNT (DISTINCT et. идентификатор_пользователя) КАК total_times ОТ tbl_main е РЕГИСТРИРУЙТЕСЬ tbl_friends эф ВКЛ (ef.main_id = e.id) РЕГИСТРИРУЙТЕСЬ tbl_cats ГЭ по (et.main_id = e.id) WHERE e.user_id = $ user_id ORDER BY e.id DESC, но это не хорошо, как я вижу. – peter

+1

@peter, не добавляйте дополнительный контент к своему собственному вопросу в комментариях. Измените исходный вопрос и добавьте информацию там, где его легко найти, и вы можете его правильно отформатировать. –

ответ

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 для двух запросов и посмотрите, как они тарифицируются.

Смежные вопросы