对联合查询SQL使用相同的别名

时间:2013-06-20 09:10:22

标签: sql sqlite

所以昨天我遇到了一个问题/问题。
我正在建立聊天(使用AJAX)并使用两个表:

TABLE users -> 'name', 'username', 'password', 'time'
TABLE messages -> 'sendFrom', 'sendTo', 'message', 'time'

现在,一个示例消息将是
'foo' | 'bar' | 'Hey, how are you?' | 130611134427611

我被告知正确的方法是使用ID列,并将其用作主键而不是用户名(无论如何,这都是有意义的。)

好的,现在这看起来像是 TABLE users -> 'ID', 'name', 'username', 'password', 'time'
TABLE messages -> 'sendFrom', 'sendTo', 'message', 'time'

现在,一个示例消息将是
'22' | '7' | 'Hey, how are you?' | 130611134427611

我设法JOIN两个表都返回第一个示例消息中的行,但由于我也检测到用户按键,我需要扫描表两次,所以:

SELECT * 
FROM (SELECT * 
      FROM (SELECT * 
            FROM messages 
            WHERE sendTo = '$username'
              AND time > (SELECT time FROM users 
                          WHERE username = '$username' LIMIT 1)
              AND message <> '$keypressCode' 
            ORDER BY time DESC LIMIT 30) 
      ORDER BY time ASC) 
UNION
SELECT * 
FROM (SELECT * 
      FROM messages 
      WHERE message = '$keypressCode'
        AND time > (SELECT time FROM users 
                    WHERE username = '$username' LIMIT 1)
        AND sendTo = '$username' LIMIT 1);

但是现在,我当然不只是从消息中选择;相反,我使用像

这样的长查询
SELECT * FROM (
    SELECT u1.ID as sendTo, u2.ID as sendFrom, messages.message, .....
    .....
    .....
    .....
    .....
) as messages;

只能在messages的地方插入(我还没有尝试过这个,但我想是这样的。看,问题是我DuckDuckGo'ed和谷歌搜索没有找到,所以我来到这里)


我的第一个问题是: 有没有办法将ALIAS用于表格messages,这样我就不必扫描它了两次?因此,我只是使用ALIAS作为名为messages的表格保存上述查询,并在UNION的每个部分中选择一次两次的数据。

此外,第一个问题的答案也是一个答案: 有没有办法使用ALIAS来保存从表中选择的time? (因为,我再次寻找它)。


在实践中,我所做的可能不是很有效(因为最多会有20个用户),但如果呢? 另外,我是一名数学家,无论喜欢与否,我都非常担心效率!

提前非常感谢,我希望我能说清楚。

3 个答案:

答案 0 :(得分:2)

我不确定,但看起来好像你想要view

像这样定义该查询:

CREATE VIEW MyMessageView
AS
SELECT ...
FROM ...
...

现在,您可以在可以使用普通表的任何上下文中使用该视图:在FROM子句中,在JOIN子句中,作为子查询等。:

SELECT  ...
FROM MyMessageView
WHERE ...
...
UNION
SELECT ...
FROM MyMessageView
WHERE ...

答案 1 :(得分:0)

不使用UNION,而是在条件中放置OR:

SELECT * 
    FROM messages 
    WHERE time > (SELECT time FROM users 
                  WHERE username = '$username' LIMIT 1)
        AND (message <> '$keypressCode' AND sendTo = '$username'
             OR message = '$keypressCode')

答案 2 :(得分:0)

我正在回答我自己的问题,因为我认为人们可能正在寻找的是VIEW

首先,像这样定义该查询:

CREATE VIEW MyViewTable
AS
    SELECT ...
    FROM ...
    ...
...;

现在,您可以在可以使用普通表的任何上下文中使用该视图(这是一个sepparate查询):在FROM子句中,在JOIN子句中,作为子查询等。:

SELECT  ...
FROM MyViewTable
    WHERE ...
    ...

UNION

SELECT ...
    FROM MyViewTable
    WHERE ...

但有一些限制:

  • 您的无法 SELECT使用子查询从您的视图中

     SELECT * FROM MyViewTable WHERE someColumn = (SELECT ... ...)
    

    但是(正常情况下)您可以在创建VIEW和主查询时使用子查询。

  • SELECT语句不能引用预处理语句参数。
  • 定义不能引用TEMPORARY表,也无法创建TEMPORARY视图。

(还有更多,但在我看来,这是最常见的查询之一,因此限制可能是最常见的错误之一。有关详细信息,请参阅SQLite reference。)。