SQL-запрос объединения в php - PullRequest
0 голосов
/ 04 июля 2011

У меня проблема при попытке связать 5 таблиц с помощью SQL-запроса UNION.Одна из проблем заключается в том, что количество элементов, которые мне требуются в каждом запросе SQL, разделенных UNION, отличается.И когда я использую '' в запросе, чтобы сделать количество элементов в каждом запросе равным, он просто отображает результат только из первого запроса.Вот запрос, который связывает 5 таблиц.

$sql ="(SELECT a.a1,b.b1 
          FROM a,b 
         WHERE a.a2 = b.b2) 
       UNION
       (SELECT a.a1,c.c1 
          FROM a,c 
         WHERE a.a3 = c.c3) 
       UNION
       (SELECT a.a1,d.d1,d.d2 
          FROM a,d 
         WHERE a.a4 = d.d4) 
       UNION
       (SELECT a.a1,e.e1,e.e2,e.e3 
          FROM a,e 
         WHERE a.a5 = e.e5)";

Это показывает ошибку, в то время как, когда я переписываю ее так, чтобы количество элементов было равным (здесь 4) как:

$sql ="(SELECT a.a1,b.b1,'','' 
          FROM a,b 
         WHERE a.a2 = b.b2) 
        UNION
        (SELECT a.a1,c.c1,'','' 
           FROM a,c 
          WHERE a.a3 = c.c3) 
        UNION
        (SELECT a.a1,d.d1,d.d2,'' 
           FROM a,d 
          WHERE a.a4 = d.d4) 
        UNION
        (SELECT a.a1,e.e1,e.e2,e.e3 
           FROM a,e 
          WHERE a.a5 = e.e5)";

Я получаю только результат 1-го запроса, т. Е. Результат SELECT a.a1, b.b1, '', '' из a, b, где a.a2 = b.b2 отдельно

Ответы [ 4 ]

1 голос
/ 04 июля 2011

Возможно, эти запросы возвращают много дубликатов.Попробуйте использовать UNION ALL вместо UNION, потому что последний удаляет повторяющиеся строки.

0 голосов
/ 04 июля 2011

Я бы предложил использовать UNION ALL и добавить идентификатор к каждой части, что-то вроде

 SELECT "q1" AS src, a.a1, b.b1, NULL, NULL
 FROM a
 JOIN b ON a.a2 = b.b2
UNION ALL
 SELECT "q2" AS src, a.a1, c.c1, NULL, NULL
 FROM a
 JOIN c ON a.a3 = c.c3 
[...]

Таким образом, вы, по крайней мере, сможете узнать, какая часть вашего UNION возвращает данные

0 голосов
/ 04 июля 2011

Я предлагаю выполнить каждое отдельное утверждение отдельно и определить, получаете ли вы ожидаемые результаты от каждого из них.

0 голосов
/ 04 июля 2011

Используйте NULL вместо пустой строки:

$sql ="SELECT a.a1, b.b1, NULL, NULL
         FROM a
         JOIN b ON a.a2 = b.b2
       UNION
       SELECT a.a1, c.c1, NULL, NULL
         FROM a
         JOIN c ON a.a3 = c.c3 
       UNION
       SELECT a.a1, d.d1, d.d2, NULL
         FROM a
         JOIN d ON a.a4 = d.d4
       UNION
       SELECT a.a1, e.e1, e.e2, e.e3 
         FROM a
         JOIN e ON a.a5 = e.e5";

NULL - это не значение, а заполнитель для отсутствия какого-либо значения.

Это необходимо, поскольку для операторов UNION (включая UNION ALL) требуется, чтобы существовало одинаковое количество столбцов, возвращаемых во всех объединенных операторах SELECT, и чтобы типы данных соответствовали.

Если вы все еще не видите ожидаемых данных, вам нужно посмотреть на каждое утверждение в отдельности, чтобы убедиться, что оно действительно возвращает данные. Возможно, соединение не работает так, как вы ожидали ...

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