【问题标题】:SQL - Select IDs from two different tablesSQL - 从两个不同的表中选择 ID
【发布时间】:2012-11-06 16:45:50
【问题描述】:

我有两个表,其中包含不同操作的日志信息。我想从两个记录表中选择信息并显示它。我无法修改应用程序,因此无法修改表结构。假设我想要 30 条记录,我想我可以编写某种连接查询,它只会按时间顺序返回每个表的 ID。然后我可以简单地运行两个单独的查询,从各个表中选择这些 ID。我不知道该怎么做,或者你是否能做到这一点,我有点不知所措。任何人都可以帮忙吗?如果有更清洁的解决方案,我也很乐意听到,我正在使用 PHP。

示例数据:

魔法选择? FROM table1 MAGIC JOIN table2 MAGICALLY ORDER BY date DESC LIMIT 3

表 1

|------|-------|------------|
| id   | date  | other data |
|------|-------|------------|
| 1    | 8     | ...        |
| 2    | 5     | ...        |
| 3    | 3     | ...        |
|------|-------|------------|

表 2

|------|-------|------------|
| id   | date  | other data |
|------|-------|------------|
| 1    | 6     | ...        |
| 2    | 4     | ...        |
| 3    | 12    | ...        |
|------|-------|------------|

输出

|-----------|-----------|
| table1_id | table2_id |
|-----------|-----------|
| NULL      | 3         |
| 1         | NULL      |
| NULL      | 1         |
|-----------|-----------|

提前致谢。

【问题讨论】:

  • 有了这么多魔法,您应该不需要我们的帮助。
  • 这些表有什么关联吗?从您的问题中不清楚,但这很重要。
  • @MichaelBerkowski 不。这有点痛苦,我希望我可以修改应用程序以使其更加理智,但不幸的是我不能。
  • @njk 这会是一个精彩的愚人节 RFC

标签: php sql join


【解决方案1】:
SELECT table1_id, table2_id
FROM
(
    SELECT id AS table1_id, NULL AS table2_id, ctime AS time
    FROM Table1
    UNION ALL
    SELECT NULL AS table1_id, id AS table2_id, date AS time
    FROM Table2
) x
ORDER BY time DESC
LIMIT 3

SQL Fiddle example

【讨论】:

  • 请检查您的最终SELECT 列表,这不会给他指定的结果集。
【解决方案2】:

我想我的阅读方式与其他答案不同。在我看来,您想要一个按时间排序的前 30 个 ID 的列表,而不关心它们来自哪个表。

Select table1_id, table2_id From 
(
   Select ID as table1_id, NULL as table2_id, Date From Table1
   UNION ALL
   Select NULL as table1_id, ID as table2_id, Date From Table2 
)
Order by Date DESC 
Limit 30

【讨论】:

  • Union 是我一直在寻找的,我以前从未使用过它们。非常感谢!
【解决方案3】:
SELECT table1.id AS table1_id, table2.id AS table2_id 
FROM table1 
JOIN table2 
ON table1.id = table2.id 
ORDER BY table2.date DESC

【讨论】:

  • 这假定table1.id 等价于table2.id,这在问题中没有指定,并且结果暗示它们可能无论如何都不是。不过,在很多情况下,这是合乎逻辑的假设。
  • 不幸的是,它们并不等同。这只是table1或table2中唯一记录的ID,它们没有关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多