MySQL не показывает результата, когда пустая сводная таблица в запросе - PullRequest
0 голосов
/ 26 марта 2020

Этот запрос в MySQL 5.7.28 Ubuntu:

SELECT
    p.*
FROM
    testvvs as p,
    testvvs_privs AS priv
WHERE
    p.parent = 0 OR (p.userid = priv.userid AND priv.writepriv = 1)

возвращает пустой результат, если сводная таблица priv пуста, правильный результат, если любое произвольное значение в priv. Что происходит?

Танки и наилучшие пожелания

1 Ответ

1 голос
/ 26 марта 2020

Объединение через запятую создает декартово произведение, все на первом столе соединяется со всем на втором столе - но нет декартового произведения, если вторая таблица пуста. Если во второй таблице есть что-то, то будет декартово произведение и условие where можно применить, если вы

SELECT
    p.*,priv.*
FROM
    testvvs as p,
    testvvs_privs AS priv;

Для обоих сценариев ios, тогда вы увидите, что происходит.

так

MariaDB [sandbox]> drop table if exists testvvs,testvvs_privs;
Query OK, 0 rows affected (0.191 sec)

MariaDB [sandbox]> create table testvvs(userid int,parent int);
Query OK, 0 rows affected (0.233 sec)

MariaDB [sandbox]> insert into testvvs values(1,0);
Query OK, 1 row affected (0.031 sec)

MariaDB [sandbox]> create table testvvs_privs(userid int,writepriv int);
Query OK, 0 rows affected (0.184 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> SELECT
    ->     p.*,priv.*
    -> FROM
    ->     testvvs as p,
    ->     testvvs_privs AS priv;
Empty set (0.015 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> insert into testvvs_privs values(2,1);
Query OK, 1 row affected (0.015 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> SELECT
    ->     p.*,priv.*
    -> FROM
    ->     testvvs as p,
    ->     testvvs_privs AS priv;
+--------+--------+--------+-----------+
| userid | parent | userid | writepriv |
+--------+--------+--------+-----------+
|      1 |      0 |      2 |         1 |
+--------+--------+--------+-----------+
1 row in set (0.001 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> SELECT
    ->     p.*,priv.*
    -> FROM
    ->     testvvs as p,
    ->     testvvs_privs AS priv
    -> WHERE
    ->     p.parent = 0 OR (p.userid = priv.userid AND priv.writepriv = 1);
+--------+--------+--------+-----------+
| userid | parent | userid | writepriv |
+--------+--------+--------+-----------+
|      1 |      0 |      2 |         1 |
+--------+--------+--------+-----------+
1 row in set (0.001 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...