1

我的 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;

这不能包含事物列表,以便在我与另一个 PHP 系统集成的 PHP 应用程序中使用 INSERT 或 UPDATE 查询中的视图表保持可编辑。我的用户表有 442 长,我只得到其中的 1/2。

问题:
我无法获取users表中的所有行,因为它们显然不是所有profile_values.fid的 26、27 或 8。

问:我如何调整语句以仍然包含那些但不违反启用可编辑性的规则?

ps.对于好奇的我正在尝试通过 Drupal DB 对 phpScheduleIt 用户进行身份验证

4

1 回答 1

1

我无法获取 users 表中的所有行,因为它们显然不具有 26、27 或 8 的 profile_values.fid。

这是因为您的查询使用 INNER JOIN,如果您需要可能没有支持记录的数据,则需要使用 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
于 2010-06-18T20:18:09.430 回答