|
Выборка из трехпольной таблицы
|
|||
---|---|---|---|
#18+
День добрый! Пытаюсь решить такую задачку, уже долго ... Есть табличка из трех полей (все целочисленные), одно - автоинкрементное (первичный ключ), два других - образуют составной ключ и одновременно являются внешними ключами по отношению к родительским таблицам .... Табличка создана для устранения отношения многие-ко-многим (до сих пор не понимаю как эта проблема решается в постгресе, там недопустимо использовать часть составного ключа в качестве внешнего ключа) Задачка состоит в следующем: (пусть поле первичного ключа имеет имя id, двух других Lid и Rid) Необходимо выбрать из этой таблички по одной и только одной записи для каждого значения Lid присутствующего в таблице), мож не оч ясно так что пример: Lid id Rid 1 1 1 1 2 7 1 3 5 2 4 2 2 5 7 3 6 9 4 7 1 4 8 2 4 9 10 В данном случае выборка должна давать (ОДИН ! из допустимых вариантов) Lid id Rid 1 3 5 2 4 2 3 6 9 4 8 2 Вообщем средствами SELECT c учетом DISTINCT и TOP я не смог найти решения, подскажите решение .... Пасиба ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2010, 23:30 |
|
Выборка из трехпольной таблицы
|
|||
---|---|---|---|
#18+
_usa__83_, group by LID тебе поможет ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2010, 23:35 |
|
Выборка из трехпольной таблицы
|
|||
---|---|---|---|
#18+
Похоже в твоей задаче не хватает исходных данных. ID - как правило никакой смысловой нагрузки не имеет и какие-либо операции кроме сравнения с ним бессмысленны, поэтому совсем непонятно почему в результат должно попасть именно 1 3 5, а не 1 2 7 например. Вероятнее всего это определяется данными таблиц, на которые ссылаются LID и RID т.е. запрос примерно такой должен быть: Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2010, 06:54 |
|
Выборка из трехпольной таблицы
|
|||
---|---|---|---|
#18+
Dima T, Поясню для чего же это надо.... Пусть LeftTable таблица: Имя_студентки, ID_студентки, RightTable: Имя_студента, ID_студента, CentralTable Дата_пересыпа, ID_студентки, ID_студента, ID_записи_о_пересыпе ... Хотелось бы создать табличку (на основе этих трех) следующего вида {ID_пересыпа, Имя_студентки, ID_родительской записи, Имя_студента, Дата_пересыпа} допустим LT: 1 Иванова 2 Петрова 3 Сидорова 4 Забулдыгина RT: 1 Гаспарян 2 Филюшкин 3 Попкин CT: LId Id RId Date 1 1 1 1.01.02 1 2 3 2.01.02 2 3 2 3.01.02 2 4 3 3.01.02 3 5 1 4.02.02 3 6 2 17.09.03 3 7 3 18.12.05 Должно получиться: 1 Иванова 0 Гаспарян 1.01.02 2 Иванова 1 Попкин 2.01.02 3 Петрова 0 Филюшкин 3.01.02 4 Петрова 3 Попкин 3.01.02 и т.д. Это все для того чтобы можно было отображать все записи о персыпах (в примере)) для конкретной записи в LT (аналогично и для правой можно создать) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2010, 08:58 |
|
Выборка из трехпольной таблицы
|
|||
---|---|---|---|
#18+
igorbik, Не совсем понял как упорядочение при (склеивании??) поможет отсеить записи с повторяющимися значениями LId ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2010, 08:59 |
|
Выборка из трехпольной таблицы
|
|||
---|---|---|---|
#18+
Dima T, именно поэтому необходимо определить по одной записи для каждого LId чтобы поле ID_родительской сделать 0, все остальные записи для этого значения LId должны иметь в качестве значения ID_родительской RId записи у которой LId тот же а ID_родительской 0 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2010, 09:04 |
|
Выборка из трехпольной таблицы
|
|||
---|---|---|---|
#18+
_usa__83_igorbik, Не совсем понял как упорядочение при (склеивании??) поможет отсеить записи с повторяющимися значениями LId Не упорядочение, а группировка. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2010, 11:38 |
|
Выборка из трехпольной таблицы
|
|||
---|---|---|---|
#18+
igorbik, Согласен, бум дум .... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2010, 11:48 |
|
Выборка из трехпольной таблицы
|
|||
---|---|---|---|
#18+
Примеры понагляднее оформляй, а то глаза сломать можно. Тэг CSV для этого есть. LT: LIDWomen1Иванова2Петрова3Сидорова4Забулдыгина RT: RIDMen1Гаспарян 2Филюшкин3Попкин CT: (Ключевое поле всегда первым пиши, так понятнее) CIdLIdRIdDate 1111.01.022132.01.023223.01.024233.01.025314.02.0263217.09.0373318.12.05 Должно получиться: LIDWomenCIdMenDate 1Иванова0Гаспарян1.01.022Иванова2Попкин2.01.023Петрова0Филюшкин3.01.024Петрова4Попкин3.01.02............... Проверь - правильно я твое повторил, CID в результате вроде неправильно был заполнен _usa__83_Dima T, именно поэтому необходимо определить по одной записи для каждого LId чтобы поле ID_родительской сделать 0, все остальные записи для этого значения LId должны иметь в качестве значения ID_родительской RId записи у которой LId тот же а ID_родительской 0 Селектом это сложно сделать, проще сначала сделать выборку: Код: plaintext 1. 2. 3. 4.
PS Как я понимаю CT.CId надо только тех записей которые последние по дате, поищи в форуме, ВладимирМ несколько раз ссылку на пример такой выборки давал. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2010, 12:09 |
|
Выборка из трехпольной таблицы
|
|||
---|---|---|---|
#18+
igorbik, пасиб, действительно решается SELECT Lid, max(Cid) from central table group by lid .... где cid - первичный ключ таблицы centraltable ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2010, 12:31 |
|
Выборка из трехпольной таблицы
|
|||
---|---|---|---|
#18+
_usa__83_действительно решается SELECT Lid, max(Cid) ... Легко, просто ... и неправильно, это называется ошибка проектирования. Как можно сравнивать абстрактные идентификаторы на больше-меньше? Подобные конструкции опираются только на то, что идентификаторы выдаются по возрастанию, т.е. больший идентификатор завели позже, т.е. предполагаем что сортировка по CID совпадает с сортировкой по Date (если Date это дата когда внесли запись). Но если внесут запись задним числом, то будет выбрана эта запись, а не правильная - более поздняя с меньшим CID. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2010, 12:50 |
|
Выборка из трехпольной таблицы
|
|||
---|---|---|---|
#18+
Dima T, Да, согласен, но в моем случае не принципиально (я писал что должен создать таблицу с parent_id, чтоб можно было с древовидной структурой одного уровня вложенности работать) а последовательность записей в создаваемой таблице значения не имеет... В представленном примере (дата была введена для наглядности) надо просто получать список кто с кем спал (...) и группировать по parent_id... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2010, 14:02 |
|
|
start [/forum/topic.php?fid=41&msg=37032996&tid=1584675]: |
0ms |
get settings: |
12ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 299ms |
total: | 437ms |
0 / 0 |