MySQL Inner Join таблица на основе значения столбца - PullRequest
4 голосов
/ 28 марта 2011

Предположим, у меня есть таблица 'stats' со следующей структурой:
tableName | id | pageViews
Столбец tableName соответствует отдельным таблицам в базе данных.

При выполнении запроса к "stats"Каков наилучший способ для внутреннего соединения с результатом столбца tableName для получения данных каждой таблицы?
Я думал о запуске динамического выбора в foreach, а затем о слиянии результатов.Например:

foreach($tableNames as $tableName) {
    $sql = "SELECT      *
            FROM        stats s
            INNER JOIN  $tableName tbl ON s.id = tbl.id
            WHERE       tableName = '$tableName'";
}

Ответы [ 2 ]

7 голосов
/ 28 марта 2011

Чтобы получить статистику всех таблиц, вы можете использовать UNION с 2 или более вариантами выбора, по одному для каждой таблицы:

( SELECT s.*
       , table1.title AS name      --or whatever field you want to show
  FROM stats s
    JOIN $tableName1 table1
      ON s.id = table1.id
  WHERE tableName = '$tableName1'
)
UNION ALL
( SELECT s.*
       , table2.name AS name      --or whatever field you want to show
  FROM stats s
    JOIN $tableName2 table2
      ON s.id = table2.id
  WHERE tableName = '$tableName2'
)
UNION ALL
( SELECT s.*
       , table3.lastname AS name      --or whatever field you want to show
  FROM stats s
    JOIN $tableName3 table3
      ON s.id = table3.id
  WHERE tableName = '$tableName3'
)
;

Используя идею Винфреда с LEFT JOIN s.Он дает разные результаты, например, каждое поле из других таблиц выводится в своем собственном столбце (и появляется много пустых значений).

SELECT s.*
     , table1.title      --or whatever fields you want to show
     , table2.name
     , table3.lastname   --etc
FROM stats s
  LEFT JOIN $tableName1 table1
    ON s.id = table1.id
      AND s.tableName = '$tableName1'
  LEFT JOIN $tableName2 table2
    ON s.id = table2.id
      AND s.tableName = '$tableName2'
  LEFT JOIN $tableName3 table3
    ON s.id = table3.id
      AND s.tableName = '$tableName3'
--this is to ensure that omited tables statistics don't appear
WHERE s.tablename IN
   ( '$tableName1'
   , '$tableName2'
   , '$tableName3'
   )
;
3 голосов
/ 28 марта 2011

У вас есть возможность сначала присоединиться ко всем таблицам, а затем обработать их?

SELECT *
    FROM stats s
    LEFT OUTER JOIN tbl1 ON s.id = tbl.id
    LEFT OUTER JOIN tbl2 ON s.id = tbl2.id

Затем вы берете значение, которое вам понадобится в вашей программе?

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

В противном случае подумайте о хранимых процедурах и т. д.

Это простоспособ сделать это (с накладными расходами), я уверен, что другие тоже помогут вам.

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