|
|
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
Помогите новичку. Есть три таблицы: partner(id, title), person(id, partner_id, title, sort), phone (id, person_id, value, sort_phone) На выходе нужно получить: partner.*, person.title (одного человека, где sort должно быть минимально), phone.value (один телефон, где sort_phone должно быть минимально) Можно ли это сделать одним запросом типа такого: SELECT partner.*, person.title as title2, person.sort as sort2, MIN(phone.sort_phone) AS sort_phone2, person_phone.value FROM partner, person, phone WHERE partner.id=person.partner_id AND person.id=phone.person_id GROUP BY partner.title ORDER BY partners.title (Тут не знаю как назначить усливия). Или нужны вложенные запросы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 16:11:33 |
|
||
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
Преждевременная оптимизация - это зло. Напишите сначала рабочий запрос, а если не будет удовлетворять производительность, тогда пробуйте варианты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 17:15:48 |
|
||
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
Я как раз и не знаю как написать запрос. Поэтому и спрашиваю совета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 23:09:52 |
|
||
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
Странник61, если sort и sort_phone уникальны тогда ORDER BY и LIMIT вы же написали запрос, чем он не подходит? запускать пробовали? :) пример без вложенных Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 01:01:17 |
|
||
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
А в принципе: FAQ: Выборка первой/последней записи в группах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 01:05:04 |
|
||
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
Тут как раз и есть проблема. Как только добавляю GROUP BY partner.title то сортировка перестат работать. В вашем примере ORDER BY ph.sort_phone и ASC, и DESC выдают одинаковый результат SET @partner_num=(SELECT COUNT(*) FROM partner2); PREPARE GET_PARTNERS_WITH_MIN_SORT FROM ' SELECT par.*, per.*, ph.* FROM person2 per JOIN partner2 par ON per.partner_id = par.id JOIN phone2 ph ON per.id = ph.person_id GROUP BY par.title ORDER BY ph.sort_phone DESC, per.sort, par.title '; EXECUTE GET_PARTNERS_WITH_MIN_SORT USING @partner_num; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 10:02:40 |
|
||
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 10:41:44 |
|
||
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
Cygapb-007 http://sqlfiddle.com/#!2/c4e7c/8 Спасибо. Так работает. Надеялся, что можно проще, но похоже придётся взять такой вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 11:02:45 |
|
||
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
Странник61В вашем примере ORDER BY ph.sort_phone и ASC, и DESC выдают одинаковый результат Нет, в моем примере ASC и DESC выдают разные результаты. Вы туда зачем-то GROUP BY добавили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 11:12:27 |
|
||
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
там при копировании ошибка вкралась: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Вообще, может можно и проще, в FAQ например :) Просто мне было интересно попробовать сделать аналог MSSQL Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 11:22:21 |
|
||
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
hallabudСтранник61В вашем примере ORDER BY ph.sort_phone и ASC, и DESC выдают одинаковый результат Нет, в моем примере ASC и DESC выдают разные результаты. Вы туда зачем-то GROUP BY добавили. Я думал обойтись без вычисления LIMIT,поэтому пытался добавить GROUP BY. Но в вашем запросе всё равно всё работает только если sort_phone уникальны для персоны и не уникальны для разным персон. У меня sort_phone уникальны в целом, примерно как id, поэтому сортировка по ним не работает. В вашем примере я поменят значения в phone. CREATE TABLE IF NOT EXISTS partner (id int PRIMARY KEY, title varchar(50)); CREATE TABLE IF NOT EXISTS person (id int PRIMARY KEY, partner_id int, title varchar(50), sort int); CREATE TABLE IF NOT EXISTS phone (id int PRIMARY KEY, person_id int, value varchar(50), sort_phone int); INSERT INTO partner VALUES (1, 'Гугл инкорпорейтед'), (2, 'Майкрософт'), (3, 'Эпл компутерс'); INSERT INTO person VALUES (1, 1, 'Сергей Брин', 1), (2, 1, 'Ларри Пейдж', 2), (3, 2, 'Билл Гейтс', 1), (4, 2, 'Стив Балмер', 2), (5, 3, 'Стив Джобс', 1), (6, 3, 'Стив Возняк', 2); INSERT INTO phone VALUES (1, 1, '911', 1), (2, 1, '102', 2), (3, 2, '02', 5), (4, 2, '03', 6), (5, 3, '04', 10), (6, 3, '09', 9), (7, 4, '101', 7), (8, 4, '111', 8), (9, 5, '104', 3), (10, 5, '112', 4), (11, 6, '996', 11), (12, 6, '454', 12); SET @partner_num=(SELECT COUNT(*) FROM partner); PREPARE GET_PARTNERS_WITH_MIN_SORT FROM ' SELECT par.*, per.*, ph.* FROM person per JOIN partner par ON per.partner_id = par.id JOIN phone ph ON per.id = ph.person_id ORDER BY per.sort, ph.sort_phone, par.title LIMIT ?; '; EXECUTE GET_PARTNERS_WITH_MIN_SORT USING @partner_num; DROP TABLE IF EXISTS partner; DROP TABLE IF EXISTS person; DROP TABLE IF EXISTS phone; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 14:09:19 |
|
||
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
Cygapb-007Просто мне было интересно попробовать сделать аналог MSSQL В MS SQL с оконными функциями вообще песня ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 16:14:36 |
|
||
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
для затравочки... Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 16:59:52 |
|
||
|
Объединение трёх таблиц с условием
|
|||
|---|---|---|---|
|
#18+
Что-то у меня какой-то бред получается при подстановке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 22:27:31 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38420280&tid=1835915]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 355ms |

| 0 / 0 |
