Как объединить все таблицы? - PullRequest
0 голосов
/ 08 июня 2011

Я новый программист, и я не знаю, как это сделать.

У меня есть:

  • таблица с именем customers (cust_id, name)
  • таблица с именем agents (agent_id, agent_name)
  • таблица с именем authorizations (cust_id, agent_id)
  • таблица с именем product_services (p_s_id, cust_id, agent_id, item_name, item_id)

О таблице authorizations: agent_id является агентом, который является авторизованным продавцом для cust_id.Итак, мне нужно иметь возможность получать только результаты для этого конкретного cust_id под этим agent_id.

Мне нужно сделать запрос, который вернет все продукты и услуги, которые клиент имеет под всеми другими агентами.При поиске он также должен возвращать те товары / услуги, которые у меня есть и у меня.

Это то, что я пробовал до сих пор:

$sql = "SELECT 
          product_services.item_name, agents.agent_name,
          customers.name, agents.agent_id, product_services.item_id 
        FROM
          product_services 
        LEFT JOIN agents ON product_services.agent_id = agents.agent_id 
        LEFT JOIN customers ON product_services.cust_id = customers.cust_id 
        WHERE authorizations.agent_id = '$aid'
          AND  product_services.item_name LIKE '%$q%' 
        ORDER BY product_services.id DESC 
        LIMIT $start, $limit";

Ответы [ 2 ]

1 голос
/ 08 июня 2011

Как правило, запрос начинается с основной таблицы в корне ваших критериев ... Например, один клиент и присоединение к нему ... Вы также заявляете, что хотите ВСЕ продукты / услуги от ВСЕХ агентов, включая "меня" "агент, вы не хотели бы иметь фильтр по критериям $ aid.

SELECT STRAIGHT_JOIN 
      c.cust_id,
      c.name,
      ag.agent_id,
      ag.agent_name,
      ps.item_name,
      ps.p_s_id,
      ps.item_id
   from
      customers c
         join authorizations au
            on c.cust_id = au.cust_id
            [[ AND au.agent_id = '$aid' ]]
            join agents ag
               on au.agent_id = ag.agent_id
            join product_services ps
               on c.cust_id = ps.cust_id
              AND au.agent_id = ps.agent_id
              [[ AND ps.item_name like '%$q%' ]]
   order by
      ps.p_s_id DESC
   limit 
      $start, $limit

В приведенном выше запросе я поместил раздел, в котором вы можете применить

[[ AND agent criteria ]]

или критерии продукта / услуги. Но, как вы заявили, вы хотели ВСЕХ действий ВСЕХ агентов, поэтому я оставил это ... Аналогично с возможной

[[ AND product / service ]] 

критерии, которые могут / не могут быть предоставлены, и вы можете очень просто убрать их ...

- РЕДАКТИРОВАТЬ В ОБРАТНОЙ СВЯЗИ.

Согласно вашему запросу о том, как добавить больше «критериев», оно основано на происхождении таблицы. Если это будет ПЕРВАЯ таблица в предложении «FROM», вы добавите предложение WHERE и поместите критерии в эту таблицу ... Что касается других, таких как агенты и сервисы продуктов, где у меня были [[критерии]], Вы можете просто развернуть все свои критерии там (для соответствующей таблицы, с которой они соединены).

Например, вы [[критерии обслуживания продукта]] могли бы добавить что-то вроде

AND (   (   ps.Item like '%$something'
         OR ps.Item like '%$another'
         OR ps.Item like '%$more' )
     AND ps.OtherField = whatever )

Сохраняйте ваши основные условия "соединения", которые определяют отношения между таблицами в первую очередь ... только тогда, когда вы хотите добавить свои ограничивающие критерии ... Как вы можете видеть в моем примере выше, я обернул полное предложение AND () в круглых скобках, чтобы рассматривать его как единое «единичное» условие ... например, в таблице продуктов / услуг.

Надеюсь, этот образец поможет вам в будущих запросах.

1 голос
/ 08 июня 2011

KPO,

Ниже приведен запрос, который я использовал для соединения 2 таблиц.Это будет то же самое для вашего запроса, обратите внимание на синтаксис, начинающийся с "LEFT JOIN"

    SELECT 
    user.username,
    groups.group_id, groups.group_name,  
    sign.last_connected, sign.sign_id, sign.sign_name, sign.resolution_x, sign.resolution_y, LEFT(sign.sign_name, 1) AS first_char
FROM
    user
LEFT JOIN(
    groups, sign
)ON(
    user.user_id = groups.userID AND
    groups.group_id = sign.groupID
)
WHERE
    username = ? AND
    UPPER(sign.sign_name) BETWEEN "A" AND "Z"
    OR sign.sign_name BETWEEN "0" AND "9" ORDER BY sign.sign_name

Если ваш SQL-запрос изначально корректен, он должен работать для вашей части LEFT JOIN:

LEFT JOIN(agents, customers
)ON( product_services.agent_id = agents.agent_id 
AND product_services.cust_id = customers.cust_id) 
...