Оператор SELECT для VIEW в MySQL не возвращает все нужные строки - PullRequest
1 голос
/ 19 июня 2010

Мне нужна помощь с моим запросом MySQL:

CREATE OR REPLACE 
    DEFINER = CURRENT_USER
    VIEW users_phpscheduleit
AS
    SELECT 
            u.uid AS memberid,
            pass AS password, 
            mail AS email,
            pv1.value AS fname,
            pv2.value AS lname,
            pv3.value AS phone,
            e_add, e_mod, e_del, e_html, e_app, 
            is_admin, lang, timezone_scheduleit, 
            institution, logon_name
        FROM 
            users u, profile_values pv1, profile_values pv2, profile_values pv3
        WHERE
            u.uid = pv1.uid AND u.uid = pv2.uid AND u.uid = pv3.uid
            AND 
            pv1.fid = 26
            AND
            pv2.fid = 27
            AND 
            pv3.fid = 8;

Это не может содержать список вещей , чтобы он оставался редактируемым при помощи таблицы представления в запросе INSERT или UPDATE в приложении PHP, которое я интегрирую с другой системой PHP. Моя таблица пользователей имеет длину 442, и я получаю только половину из них.

Проблема:
Я не могу получить все строки в таблице users, потому что они, очевидно, не все имеют profile_values.fid из 26, 27 или 8.

В: Как я могу настроить оператор, чтобы он по-прежнему включал те, но без нарушения правил , которые обеспечивают возможность редактирования?

ps.для любопытных я пытаюсь аутентифицировать пользователей phpScheduleIt через Drupal DB

1 Ответ

1 голос
/ 19 июня 2010

Я не могу получить все строки в таблице пользователей, потому что они, очевидно, не все имеют profile_values.fid 26, 27 или 8.

Это потому, что ваш запрос использует INNER JOINs, когда вам нужно использовать OUTER (IE LEFT / RIGHT) JOIN, если вам нужны данные, в которых есть вероятность отсутствия поддержки записи. Ваш запрос в синтаксисе ANSI-89, который не всегда реализует синтаксис OUTER JOIN. Вот ваш запрос, переписанный с использованием синтаксиса ANSI-92:

   SELECT u.uid AS memberid,
          pass AS password, 
          mail AS email,
          pv1.value AS fname,
          pv2.value AS lname,
          pv3.value AS phone,
          e_add, e_mod, e_del, e_html, e_app, 
          is_admin, lang, timezone_scheduleit, 
          institution, logon_name
     FROM USERS u
LEFT JOIN PROFILE_VALUES pv1 ON pv1.uid = u.uid
                            AND pv1.fid = 26
LEFT JOIN PROFILE_VALUES pv2 ON pv2.uid = u.uid
                            AND pv2.fid = 27
LEFT JOIN PROFILE_VALUES pv3 ON pv3.uid = u.uid
                            AND pv3.fid = 8
...