Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql选择与联合所有_Mysql_Union All - Fatal编程技术网

mysql选择与联合所有

mysql选择与联合所有,mysql,union-all,Mysql,Union All,我得到 表 | id | san | status | created | ------------------------------------------- | 1 | 100 | 3 | 2013-11-01 19:26:20 | | 2 | 200 | 8 | 2013-11-02 03:19:35 | | 3 | 300 | 1 | 2013-11-03 06:13:38 | | 4 | 100 | 2 | 20

我得到

| id | san | status |       created       |
-------------------------------------------
| 1  | 100 |   3    | 2013-11-01 19:26:20 |
| 2  | 200 |   8    | 2013-11-02 03:19:35 |
| 3  | 300 |   1    | 2013-11-03 06:13:38 |
| 4  | 100 |   2    | 2013-11-06 08:28:37 |
| 5  | 100 |   4    | 2013-11-27 19:00:00 |
| 6  | 200 |   1    | 2013-11-27 19:16:22 |
| 7  | 200 |   3    | 2013-11-27 19:33:33 |
| 8  | 300 |   5    | 2013-11-27 19:50:29 |
表B

| san | san-name |
------------------
| 100 |   xxx1   |
| 200 |   xxx2   |
| 300 |   xxx3   |
使用此查询(使用union all,因为我有很多行)

我得到了这个结果(一切都很完美)


但现在我还想将最新“创建的”id的“状态”添加到我的结果中。



从表A中,我需要行(请参见我将尝试此查询:

SELECT tA.san AS id, tA.status, tA.created AS lastdate, tB.`san-name`
FROM
  tableA tA INNER JOIN (SELECT san, MAX(created) AS max_created
                        FROM tableA
                        GROUP BY san) m
  ON tA.san=m.san AND tA.created=m.max_created
  INNER JOIN tableB tB
  ON tA.san=tB.san
请看小提琴

编辑

如果需要返回tableB中的所有记录,并且只返回匹配的记录,则需要使用右连接(这有点不常见),或者我们可以交换连接的表的顺序并使用左连接,如下所示:

| id  | status |      lastdate       |   san   |
------------------------------------------------
| 100 |    4   | 2013-11-27 19:00:00 |   xxx1  |
| 200 |    3   | 2013-11-27 19:33:33 |   xxx2  |
| 300 |    5   | 2013-11-27 19:50:29 |   xxx3  |
SELECT tB.san AS id, tA.status, tA.created AS lastdate, tB.`san-name`
FROM
  tableB tB LEFT JOIN
  (SELECT san, MAX(created) AS max_created
   FROM tableA
   GROUP BY san) m
  ON tB.san=m.san
  LEFT JOIN TableA tA
  ON tA.san=m.san AND tA.created=m.max_created

Fiddle是。

hi..谢谢你的评论!我稍后会在我的服务器上尝试此功能。希望你的代码速度快:D与我的旧代码相比,耗时30秒..因此我不得不选择unionall@bernte我希望它是正确的,并且和联合查询一样快:)如果是,它也应该更容易阅读!如果速度太慢,我会尝试在两个表的san列上添加索引,也会在created列上添加索引。@bernte我会尝试使用组合索引
在tableA(san,created)上创建索引idx1并使用
在表B(san)上创建唯一索引idx2@bernte那么你需要右连接或左连接。。。请看我更新的答案@伯恩特:谢谢是的索引应该是相同的。。。也许您可以尝试在tableA(san)上使用两个单独的索引
创建索引idxA1,而不是单个idx1
在表A上创建索引idxA2(已创建)但是很难说哪一个比另一个快。。。不能确定,但是你已经拥有的索引应该更好!
| id  | status |      lastdate       |   san   |
------------------------------------------------
| 100 |    4   | 2013-11-27 19:00:00 |   xxx1  |
| 200 |    3   | 2013-11-27 19:33:33 |   xxx2  |
| 300 |    5   | 2013-11-27 19:50:29 |   xxx3  |
SELECT id, status, max(lastdate) AS lastdate, max(san) AS san
FROM
    (SELECT `san` AS id,
            `created` AS lastdate,
            '' AS san,
            status AS status
     FROM `TableA` a
     UNION ALL
     SELECT `san` AS id,
            cast(null as datetime) AS lastdate,
            `san-name` AS san,
            '' AS status
     FROM `TableB` b
    ) sq
GROUP BY id 
ORDER BY san ASC
| id  | status |      lastdate       |   san   |
------------------------------------------------
| 100 |    3   | 2013-11-27 19:00:00 |   xxx1  |
| 200 |    8   | 2013-11-27 19:33:33 |   xxx2  |
| 300 |    1   | 2013-11-27 19:50:29 |   xxx3  |
| id  | status |      lastdate       |   san   |
------------------------------------------------
| 100 |    4   | 2013-11-27 19:00:00 |   xxx1  |
| 200 |    3   | 2013-11-27 19:33:33 |   xxx2  |
| 300 |    5   | 2013-11-27 19:50:29 |   xxx3  |
SELECT tA.san AS id, tA.status, tA.created AS lastdate, tB.`san-name`
FROM
  tableA tA INNER JOIN (SELECT san, MAX(created) AS max_created
                        FROM tableA
                        GROUP BY san) m
  ON tA.san=m.san AND tA.created=m.max_created
  INNER JOIN tableB tB
  ON tA.san=tB.san
SELECT tB.san AS id, tA.status, tA.created AS lastdate, tB.`san-name`
FROM
  tableB tB LEFT JOIN
  (SELECT san, MAX(created) AS max_created
   FROM tableA
   GROUP BY san) m
  ON tB.san=m.san
  LEFT JOIN TableA tA
  ON tA.san=m.san AND tA.created=m.max_created