mysql, соединяющий два стола - PullRequest
0 голосов
/ 25 апреля 2011
table user:
id_u*   f_name   l_name
----------------------
1       andi     mitchel
2       sarah    bench
3       kirsty   larx

table voucher:
id_v*   id_user    id_target
1       1          2
2       2          3

совершенно запутался, как соединить эти таблицы с двумя внешними ключами

$db->query("SELECT * FROM voucher v 
LEFT JOIN user u ON u.id_u = v.id_user
LEFT JOIN user u1 ON u1.id_u = v.id_target
WHERE .... ")

повторяет цикл while ... и ничего не возвращает ??

while($r = $q->fetch_array(MYSQLI_ASSOC)) :
   echo  $r['u.f_name'];
   echo  $r['u1.f_name'];
endwhile;

Ответы [ 4 ]

2 голосов
/ 25 апреля 2011

Ваш JOIN кажется абсолютно правильным. Единственная проблема заключается в том, что вы присоединились к таблице user дважды, поэтому у вас есть столбцы с одинаковым именем (например, f_name). База данных будет назначать разные (но произвольные) имена этим столбцам. Вы можете изменить это поведение с помощью ключевого слова AS:

$db->query("SELECT v.*
                 , u.f_name AS user_f_name
                 , u.l_name AS user_l_name
                 , ta.f_name AS target_f_name
                 , ta.l_name AS target_l_name
            FROM voucher v 
            LEFT JOIN user u ON u.id_u = v.id_user
            LEFT JOIN user ta ON ta.id_u = v.id_target
            WHERE .... ")

Тогда:

while($r = $q->fetch_array(MYSQLI_ASSOC)) :
   echo  $r['user_f_name'];
   echo  $r['target_f_name'];
endwhile;

И я думаю, вы можете заменить LEFT JOIN с (внутренними) JOIN с. Если у вас нет значений id_user или id_target, ссылающихся на несуществующие идентификаторы пользователей (id_u).

1 голос
/ 25 апреля 2011

Похоже, что вы запрашиваете всех людей, которые находятся в таблице ваучеров, независимо от того, находятся ли они в положении 1 (пользователь) или в положении 2 (цель) ... Затем, показывая имя этого человека.

Этот запрос выполняет предварительный запрос каждого возможного человека и его позиции (через WhichPosition).

SELECT STRAIGHT_JOIN
      AllVoucherUsers.WhatPosition,
      u.*
   FROM
      ( select distinct 
              v.id_user, 
             '1' as WhatPosition
           from voucher v
        union select distinct
             v.id_target as id_user,
             '2' as WhatPosition
           from voucher v
      ) AllVoucherUsers
      join users u
         on AllVoucherUsres.id_user = u.id_u

Если вам нужен только ОДИН экземпляр данного человека - НЕЗАВИСИМО от его должности, просто удалите все экземпляры ссылки "WhatPosition" ...

SELECT STRAIGHT_JOIN
      u.*
   FROM
      ( select distinct 
              v.id_user
           from voucher v
        union select distinct
             v.id_target as id_user
           from voucher v
      ) AllVoucherUsers
      join users u
         on AllVoucherUsres.id_user = u.id_u
0 голосов
/ 25 апреля 2011
SELECT * FROM voucher v 
    LEFT JOIN user u ON u.id_u = v.id_user OR u.id_u = v.id_target
    WHERE .... 
0 голосов
/ 25 апреля 2011

как насчет: ВЫБРАТЬ * ИЗ ВАУЧЕРА ПРИСОЕДИНИТЬСЯ к пользователю ВКЛ id_user = id_u

Все еще проще:

ВЫБРАТЬ * ИЗ ВАУЧЕРА, пользователь ГДЕ id_user = id_u

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