所以昨天我遇到了一个问题/问题。
我正在建立聊天(使用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个用户),但如果呢? 另外,我是一名数学家,无论喜欢与否,我都非常担心效率!
提前非常感谢,我希望我能说清楚。
答案 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
和主查询时使用子查询。
(还有更多,但在我看来,这是最常见的查询之一,因此限制可能是最常见的错误之一。有关详细信息,请参阅SQLite reference。)。