MySQL Inner Join table based on column value
Suppose I have a table 'stats' with the following structure:
tableName | id | pageViews 
The tableName column corresponds to separate tables in the database.
When running a query against "stats", what would be the best way to inner join against the tableName column result to get each table's data? 
foreach($tableNames as $tableName开发者_JAVA百科) {
    $sql = "SELECT      *
            FROM        stats s
            INNER JOIN  $tableName tbl ON s.id = tbl.id
            WHERE       tableName = '$tableName'";
}
To have all tables' statistics, you can use a UNION, with 2 or more selects, one for each table:
( 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'
)
;
Using Winfred's idea with LEFT JOINs. It produces different results, e.g. every field from the other tables is output in it's own column (and many NULLs occur).
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'
   )
;
Do you have the luxury to join all tables first,and process it afterwards?
SELECT *
    FROM stats s
    LEFT OUTER JOIN tbl1 ON s.id = tbl.id
    LEFT OUTER JOIN tbl2 ON s.id = tbl2.id
Then you take the value you need in your program afterwards?
You should try to minimise the number of queries you made to your database, try to do it in one go if possible.
Otherwise, think about Stored Procedures etc
This is one easy way of doing it(with overheads), Im sure others will help you out too.
 
         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论