Требуется помощь по запросам PHP / MYSQL - PullRequest
0 голосов
/ 15 августа 2011

Это должно быть просто.У меня есть три таблицы (показаны соответствующие столбцы).

пользователи : ID, ИМЯ ПОЛЬЗОВАТЕЛЯ, PWD

магазины : ID, MANAGER_ID (ссылается на USER_ID) , NETWORK_ID

сети : ID, ADMIN_ID (ссылается на USER_ID)

Все, что мне нужно сделать, это при входе в систему, проверить USERNAME и PWD по идентификатору и узнать, находится ли пользователь, который только что вошел в систему, просто в таблице магазинов в качестве менеджера или сетевого администратора,или оба.

Можно ли это сделать одним SELECT с PHP?Спасибо!

1 Ответ

5 голосов
/ 15 августа 2011
SELECT
    users.id AS user_id,
    shops.id AS shop_id,
    networks.id AS network_id

FROM users

LEFT OUTER JOIN shops
ON shops.manager_id = users.id

LEFT OUTER JOIN networks
ON networks.manager_id = users.id

WHERE users.username = ?
  AND users.pwd = ?

LIMIT 1

Когда этот запрос вернется, shop_id будет ненулевым, если на пользователя ссылаются из таблицы магазинов, и то же самое относится к network_id.

Обратите внимание, что если на пользователя ссылаются из таблицы магазинов или сетей более одного раза, этот запрос будет производить только одну строку; Из вашего вопроса я предполагаю, что вам все равно, с каким магазином / сетью связан пользователь, вы хотите проверить только такую ​​связь.

Кроме того, этот запрос также будет работать:

SELECT
    users.id AS user_id,

    EXISTS (SELECT shops.id
            FROM shops
            WHERE shops.manager_id = users.id)
        AS has_shop,

    EXISTS (SELECT networks.id
            FROM networks
            WHERE networks.admin_id = users.id)
        AS has_network

FROM users

WHERE users.username = ?
  AND users.pwd = ?

Один из запросов может быть быстрее другого, в зависимости от того, какие индексы вы настроили для таблиц, а также от вашей версии MySQL. Попробуйте запустить их через EXPLAIN, если проблема в производительности.

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