Помогите с MySQL запросом SELECT (на примере)

K
На сайте с 05.06.2012
Offline
0
513

Пожалуйста, помогите с запросом SELECT.

Упрощенный вариант что имеем:

TABLE: persons

id (ID человека, auto_increment)

birthdate (дата рождения)

TABLE: companies

id (ID компании, auto_increment)

inn (ИНН)

kpp (КПП)

TABLE: objects

o_id (ID объекта, auto_increment)

o_type (тип объекта, человек (persons): 1, компания (companies): 2)

o_name (название объекта)

o_data_id (ID расширенных данных объекта в другой таблице, в зависимости от типа объекта o_type)

Имеем:

objects (1, 1, 'Иванов Иван Иванович', 1);

objects (2, 2, 'ООО Ромашка', 1);

persons (1, '01.01.1970');

companies (1, '63160000, 631601001');

Одна запись в таблице objects соответствует одной записи в одной из других таблиц (в зависимости от типа объекта o_type)

Задача - получить список компаний, без использования поля o_type

Запрос сейчас:

SELECT * FROM objects o, companies c WHERE o.o_data_id = c.id

Проблема: выдает два результата вместо одного.

ЕСТЬ ЛИ РЕШЕНИЕ НА УРОВНЕ ИЗМЕНЕНИЯ ТЕКСТА ЗАПРОСА SELECT?

P.S. Такие решения, как добавить в запрос 'WHERE o_type = 2' или

добавить в таблицы persons, companies идентификатор обратной связи с объектом, например, object_id и искать через "WHERE c.object_id = o.o_id"

известны, но нежелательны.

siv1987
На сайте с 02.04.2009
Offline
427
#1
kodavra:
P.S. Такие решения, как добавить в запрос 'WHERE o_type = 2'

А чем же не подходит WHERE o.o_data_id = c.id AND o.o_type = 2?

[umka]
На сайте с 25.05.2008
Offline
456
#2

Так под логику запроса попадают две записи.

Оставить из них только одну можно лишь добавив дополнительные критерии отбора. А как же иначе?

Лог в помощь!
MagistrYoda
На сайте с 21.12.2008
Offline
91
#3

Кажестся будет так

SELECT поля FROM objects o

LEFT JOIN companies c on c.id= o.data_id

Будь Альфой : Сайт Развития Личности : www.BeAlpha.com (http://bealpha.com) Дорогу осилит идущий. Анти Говно Яндекс - АГЯ - Сообщество вебмастеров - https://vk.com/antigovnoyandex (https://vk.com/antigovnoyandex) вступай в группу
DP
На сайте с 24.04.2012
Offline
16
#4

Убрать двойные записи можно банальным group by o_data_id, но логически это ничего не дает. Чтобы получить список именно компаний, которые используются в таблице objects вы обязаны делать выборку по o_type. В любом другом случае он выдаст компании, чей id совпадает с id person в таблице object.

K
На сайте с 05.06.2012
Offline
0
#5

Так:

SELECT поля FROM objects o

LEFT JOIN companies c on c.id= o.data_id

Увы, не работает, отображает все подряд.

Вариант с добавлением o_type вполне приемлем, но потребует значительно больших трудозатрат (много кода) чем корректировка запросов SELECT.

[umka]
На сайте с 25.05.2008
Offline
456
#6
kodavra:
Вариант с добавлением o_type вполне приемлем, но потребует значительно больших трудозатрат (много кода) чем корректировка запросов SELECT.

Это как? Обычно, базы данных и SQL применяются, чтобы трудозатраты сократить :)

Вы хотите сказать, что модифицировать этот запрос каким-то чудесным способом, без использования o_type, будет менее трудозатратно, чем модифицировать этот запрос, добавив o_type? )))

Max_Q
На сайте с 14.11.2011
Offline
9
#7

Вот непонятно почему нельзя использовать where o_type=2.

А так факт что этапу проектирования приложения было выделено мало времени на лицо.

T
На сайте с 01.10.2004
Offline
73
#8

Вообще странная структура данных, ну да ладно. Подумайте на тему уникального id, т.е. сквозной id. Таким образом тип объекта будет однозначно определяться его id

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий