Связь между таблицами MYSQL





Собственно возник интересный вопросец, ответа на который пока, к сожалению, не нашёл. Имею таблицу организаций в БД, у которой есть поле `org_activities`. В этом чудесном поле хранятся через запятую id видов деятельности. Также имею табличку собственно видов деятельности (`activities`), которая имеет вполне произаическую структуру `act_id`,`act_name` ...
Задача стоит следюущая. Вытаскивая список видов деятельности одним LEFT JOIN посчитать количество организаций, которые занимаются подобной деятельностью.
Оставим в стороне вопрос подсчёта, он не критичен и решаем. проблемы возникли на более раннем этапе - на присоединении одной организации к разным выидам деятельности. Поясню на примере запроса:
SELECT * FROM `activities` a LEFT JOIN `organizations` o ON a.`act_id` IN (o.org_activities) WHERE a`act_state` = 1 ORDER BY a.`act_ord`

Казалось бы всё правильно, но результат показывает обратное. Организация имеет в поле org_activities 2,3,7. У act_id = 2 она присоединяется, у остальных же - нет.
Собственно мне нужна ваша помощь в исправлении запроса. Но буду очень благодарен и за преждложение подойти к задаче с другой стороны.
  • 29 июля 2009, 11:34
  • 1981

Ответы (6)

RSS
+
0
Ваш код не работает, потому что IN проверяет, не содержится ли левое выражение в _списке_, который справа. Но справа от IN список из _одного_ значения. Это вы знаете, что на самом деле там их много, СУБД об этом не знает. Ну и затем оно приводит строку "2,3,7", которую видит справа, к Integer, потому что слева Integer, получается 2. То есть ваша запись превращается в "act_id IN (2)".
Попробуйте вот это:
avatar

sts

  • 29 июля 2009, 20:56
+
0
Дополнение #2

integer FIND_IN_SET( str string, strlist string )

Возвращает значение от 1 до ..., в зависимости от позиции строки str среди строк (подстрок) в строке strlist. Строки (подстроки) в strlist разделены ",". Возвращает 0, если str не найдена среди строк в strlist. Возвращает NULL, если один из аргументов NULL.

Примеры:
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
avatar

obert-asparyan

  • 30 июля 2009, 21:27
+
0
Организации
id name
1 "Рога и копыта"
2 "Google"
3 "Microsoft"

Деятельности
id name
1 "что-нибудь"
2 "ещё что-то"
3 "третье"
4 "четвёртое"

Organization_actiivities
org_id act_id
1 1
1 2
2 2
2 3
3 4
avatar

ergej-moto

  • 29 июля 2009, 17:18
+
0
OMG! Через запятую!
Вспомогательную таблицу для вашей связи делайте.
avatar

zeroone

  • 1 августа 2009, 10:39
+
0
ИМХО вообще глупо через запятую указывать. Уж перечисление былобы в строчку тогда и проблемы бы ваше й и не было. ПРимер:
Имя                    org_activites
ООО Вася и КО   2
ООО Вася и КО   3
ООО Вася и КО   7
Печеньки и Плюшки 1
Печеньки и Плюшки 7
............................

Боитесь задвоений в той табличке, введите уникальный id.
avatar

otoshek

  • 29 июля 2009, 07:02
+
0
"Но буду очень благодарен и за преждложение подойти к задаче с другой стороны."
"Собственно, если кто обратил внимания вопрос был совсем о другом "

Ню-ню.
avatar

h-ov

  • 1 августа 2009, 08:38

Только зарегистрированные и авторизованные пользователи могут отвечать.