MySQL multiple LEFT JOIN возвращает повторяющиеся строки

скудность

У меня есть запрос MySQL, который используется LEFT JOINнесколько раз для подключения разных таблиц, где они authorодинаковы. Однако, когда я echoпоказываю результат, он возвращает мне тонны повторяющихся строк (на самом деле 32,920), когда у меня только 4 строки записаны в grouppostтаблице и около 100 - в остальных трех.

Таблица status

+----+------+--------------+--------+------+-------+---------------------+
| id | osid | account_name | author | type | data  |      postdate       |
+----+------+--------------+--------+------+-------+---------------------+
|  1 |    1 | John         | John   | a    | lkjg. | 2018-01-01 00:00:00 |
+----+------+--------------+--------+------+-------+---------------------+

Таблица article_status

+----+------+--------------+--------+------+-------+------+---------------------+
| id | osid | account_name | author | type | data  | artid |      postdate       |
+----+------+--------------+--------+------+-------+------+---------------------+
|  2 |    1 | John         | John   | a    | bcda. |    1 | 2018-01-01 00:00:00 |
+----+------+--------------+--------+------+-------+------+---------------------+

Таблица grouppost

+----+-----+--------+--------+------+-------+----------------------+
| id | pid | gname  | author | type | data  |         pdate        |
+----+-----+--------+--------+------+-------+----------------------+
|  3 |   1 | Group1 | John   |    1 | ABCD. |  2018-01-01 00:00:00 |
+----+-----+--------+--------+------+-------+----------------------+

Таблица photos_status

+----+------+--------------+--------+------+-------+------+---------------------+
| id | osid | account_name | author | type | data  | photo |      postdate       |
+----+------+--------------+--------+------+-------+------+---------------------+
|  4 |    1 | John         | John   | a    | abcd. | a.jpg | 2018-01-01 00:00:00 |
+----+------+--------------+--------+------+-------+------+---------------------+

Ожидаемый результат - объединить четыре строки вместе и получить idиз них с указанными именами:

+---------+--------+-------+-------+
| stat_id | art_id | gr_id | ph_id |
+---------+--------+-------+-------+
|       1 |      2 |     3 |   4   |
+---------+--------+-------+-------+

Запрос MySQL:

$sql = "
SELECT a.id AS art_id
     , g.id AS gr_id
     , p.id AS ph_id
     , s.id AS stat_id 
  FROM article_status AS a 
  LEFT 
  JOIN grouppost AS g 
    ON a.author = g.author 
  LEFT 
  JOIN photos_status AS p 
    ON a.author = p.author 
  LEFT 
  JOIN status AS s 
    ON a.author = s.author 
   AND a.author = 'John' 
   AND g.author = 'John' 
   AND p.author = 'John' 
   AND s.author = 'John'
";

$stmt = $conn->prepare($sql);
$stmt->execute();
$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {
    echo $row["gr_id"]."<br>"; // returns back duplicate rows
}
$stmt->close();
mysqli_close($conn);

Поиск возможных ошибок:

var_dump ($ результат): object(mysqli_result)#3 (5) { ["current_field"]=> int(0) ["field_count"]=> int(4) ["lengths"]=> NULL ["num_rows"]=> int(32920) ["type"]=> int(0) }

Как и в var_dumpпредыдущем случае, ["field_count"]=> int(4)это правильно, поскольку в запросе задействовано 4 поля. Однако ["num_rows"]=> int(32920)возвращается 32 920, что совершенно неверно.

var_dump ($ stmt): object(mysqli_stmt)#2 (10) { ["affected_rows"]=> int(0) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(0) ["field_count"]=> int(4) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["sqlstate"]=> string(5) "00000" ["id"]=> int(1) }

Опять же , я хотел бы, чтобы выбрать все затронутые строки из article_status, grouppost, photos_statusи statusтаблиц , где authorтакого же, как Johnв примере.

Бежевый

Во-первых, ваш запрос следует упростить до следующего:

SELECT 
      a.id art_id, 
      g.id gr_id, 
      p.id ph_id, 
      s.id stat_id
   FROM 
      article_status a 
         LEFT JOIN grouppost g 
            ON a.author = g.author 
         LEFT JOIN photos_status p 
            ON a.author = p.author 
         LEFT JOIN status s 
            ON a.author = s.author 
   where
      a.author = 'John' 

вы явно повторно добавляли AND author = 'John' для каждого из ваших других присоединений. Они должны были остаться с соответствующим предложением «ON», а не сгруппированы в конце. Кроме того, через транзитивную ассоциацию ex:

A = B   and B = C, therefore A = C.

Если вы уже присоединяетесь к AUTHOR между каждой соответствующей таблицей, наличие единственного предложения WHERE для «a.author = 'John'» также отразит все остальные как «John».

Что касается дубликатов, может ли это быть основано на декартовом результате, что у вас есть несколько записей «Джон» как у автора, и он присоединяется к каждому другому идентификатору на основе имени, а не того, что, по вашему мнению, вы хотели получить.

Ex Данные.

Article Status
id author author_lastName
1  John   A
2  Bill   E
3  John   H
4  Mary   J
5  John   M


GroupPost
id  author  author_lastname
1   Mary    J
2   John    M
3   John    M
4   John    A
5   Bill    E
6   John    H

Итак, только из приведенного выше примера из двух таблиц, для каждого «John» в таблице Article он находит все имена «John» в таблице GroupPost и в результате

Article ID   GroupPostIT
1 (John A)   2 (John M)
1 (John A)   3 (John M)
1 (John A)   4 (John A)
1 (John A)   6 (John H)

3 (John H)   2 (John M)
3 (John H)   3 (John M)
3 (John H)   4 (John A)
3 (John H)   6 (John H)

6 (John M)   2 (John M)
6 (John M)   3 (John M)
6 (John M)   4 (John A)
6 (John M)   6 (John H)

Теперь перенесите это и на другие столы, и вы увидите, что получите больше, чем ожидаете. Вероятно, вам понадобится лучшая ассоциация «ID» между таблицами, чем общее имя, которое было бы обычным.

Например, ваш GroupPost должен иметь authorID, а не просто имя ... то же самое с другими таблицами.

Эта статья взята из Интернета, укажите источник при перепечатке.

Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.

Отредактировано в
0

я говорю два предложения

0обзор
Войти в системуУчаствуйте в комментариях

Статьи по теме

MYSQL LEFT JOIN and multiple ORDER BY

mysql multiple COUNT () из нескольких таблиц с LEFT JOIN

MySQL Query Multiple LEFT JOIN с столбцом WHERE NOT LIKE

Mysql - LEFT JOIN быстрее, чем INNER JOIN

Mysql left join не работает

MySQL LEFT JOIN не возвращает NULL для отсутствующих строк

Как привести значение NULL даже после того, как соединение присутствует в MYSQL LEFT JOIN

Как в MySQL считать ноль, если LEFT JOIN ничего не соответствует?

MySQL 5.1.73 Тайм-аут LEFT JOIN

MySQL: Добавить WHERE в LEFT JOIN

MYSQL Объединить два столбца из двух таблиц и по-прежнему использовать LEFT JOIN

Оптимизация запроса MySQL LEFT JOIN для простой схемы из трех таблиц?

MySQL: вопрос LEFT JOIN, возвращает слишком много записей

Mysql left join для проверки записи с использованием предложения where только в одной таблице

Как объединить MYSQL Left Join и Group By для другой таблицы

Более эффективный способ включить пустые строки, чем LEFT JOIN в ту же таблицу в mysql?

MySQL left join с заданными идентификаторами

MySQL Left Join возвращение несвязанных записей, несмотря на использование IS NOT NULL

MySQL LEFT JOIN с помощью или очень медленно

MySQL LEFT JOIN 2 запроса из разных баз данных

MySQL LEFT JOIN - Как обрабатывать случаи, когда записи не совпадают с PHP

MySQL игнорирует оператор AND в предложении LEFT JOIN?

MySQL left join пустой результат

Скорость LEFT JOIN в той же таблице - Mysql

mysql left join and not equals должен возвращать только одну строку

Проблема в представлении MySQL с LEFT JOIN ... GROUP BY

СУММА, смешанная с LEFT JOIN и GROUP BY в запросе MYSQL

Запрос MySQL с условиями LEFT JOIN и LIKE не показывает то, что я ожидал

MySQL - Выберите последние строки столбца LEFT JOIN на основе полей

TOP список

  1. 1

    Распределение Рэлея Curve_fit на Python

  2. 2

    Резервное копирование / восстановление kafka и zookeeper

  3. 3

    Редактировать существующий файл Excel C # npoi

  4. 4

    Ipython использует% store magic для получения динамического имени

  5. 5

    Как получить список индексов всех значений NaN в массиве numpy?

  6. 6

    Почему бы не выдать ошибку ERROR в тесте Jasmine?

  7. 7

    Дженерики и потоки Java

  8. 8

    Как отфильтровать несколько столбцов в Qtableview?

  9. 9

    Как добавить Swagger в веб-API с поддержкой OData, работающий на ASP.NET Core 3.1

  10. 10

    Как изменить значок приложения для проекта libgdx android

  11. 11

    Thymeleaf не отображает значения в проекте Spring Boot

  12. 12

    Unity Проверить, включен ли Toggle

  13. 13

    Airflow не распознает мои настройки подключения S3

  14. 14

    Flutter: Unhandled Exception: FileSystemException: Creation failed, path = 'Directory: '' (OS Error: Read-only file system, errno = 30)

  15. 15

    Bogue étrange datetime.utcnow()

  16. 16

    На графике Matplotlib не отображается легенда

  17. 17

    Создание X509Certificate2 из ECC X509Certificate выдает исключение System.NotSupportedException в C #

  18. 18

    Как добавить фреймворк в файл в папке «Источники» Xcode Playground?

  19. 19

    Выполнение команд PowerShell в программе Java

  20. 20

    Статус HTTP 403 - ожидаемый токен CSRF не найден

  21. 21

    Инструмент для вставки данных, собранных в электронной таблице, в документ Word или PDF

популярныйтег

файл