Сложный SQL-запрос - PullRequest
       1

Сложный SQL-запрос

0 голосов
/ 26 августа 2011

У меня немного SQL, но я не могу найти способ вернуть текст только числами.- исправлено!

SELECT if( `linktype` = "group", 

(SELECT contactgroups.grname
FROM contactgroups, groupmembers
WHERE contactgroups.id = groupmembers.id ???
AND contactgroups.id = groupmembers.link_id),

(SELECT contactmain.contact_sur
FROM contactmain, groupmembers
WHERE contactmain.id = groupmembers.id ???
AND contactmain.id = groupmembers.link_id) ) AS adat

FROM groupmembers;

Как теперь я немного улучшился, даёт некоторую информацию, но ???(благодаря Minitech) указать мою проблему.Я не вижу, как я могу исправить ... Любой совет приветствуется!Thansk

Contactmain (id, contact_sur, email2)

data:
1 | Peter | email@email.com
2 | Andrew| email2@email.com

Contactgroups (id, grname)

data:
1 | All
2 | Trustee
3 | Comitee

Groupmembers (id, group_id, linktype, link_id) 

data:
1 | 1 | contact | 1
2 | 1 | contact | 2
3 | 2 | contact | 1
4 | 3 | group   | 2

И я хотел бы перечислить, кто входит в «Комитет», результатом должны быть Андрей и попечитель, если я прав:)

Ответы [ 2 ]

1 голос
/ 26 августа 2011

Это выглядит немного избыточно при объединении, поскольку вы подразумеваете, что столбцы ID и Link_ID имеют одно и то же значение.Поскольку оба значения выбора получены из квалификации для таблицы членов группы, я реструктурировал запрос, чтобы использовать THAT в качестве основной таблицы и выполнить СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ к каждой из других таблиц, ожидая, что по вашему запросу ссылка будет найдена изОДИН или ДРУГИЕ столы.Таким образом, с каждым соответствующим LEFT JOIN вы будете проходить таблицу GroupMembers только ОДИН РАЗ.Теперь ваш IF ().Поскольку члены группы являются основой, и у нас есть ОБА таблицы, доступные и связанные, мы просто берем столбец из одной таблицы против другой соответственно.Я включил "linktype" тоже только для справочных целей.Использование STRAIGHT_JOIN поможет движку попытаться изменить интерпретацию того, как объединять таблицы.

SELECT STRAIGHT_JOIN
      gm.linktype,
      if( gm.linktype = "group", cg.grname, cm.contact_sur ) ADat
   from
      groupmembers gm
         left join contactgroups cg
            ON gm.link_id = cg.id
         left join contactmain cm
            ON gm.link_id = cm.id
1 голос
/ 26 августа 2011

Если contactgroups.id должно равняться groupmembers.id, но также должно равняться 2, это избыточно, а также, вероятно, там, где ваша проблема. Он отлично работает, как вы написали: http://ideone.com/7EGLZ, поэтому, не зная, что это на самом деле , я не могу помочь больше.

РЕДАКТИРОВАТЬ: Я незнаком с разделенными запятыми FROM, но он дает тот же результат, так как вы ничего не выбираете из другой таблицы, так что это на самом деле не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...