4

我有一个带有变量 $lid 的 php 页面,以及一个带有可变 $uid 的用户...我需要从 2 个表中选择一些数据来填写页面。

        Table 1                          Table 2
¦----------¦----------¦    ¦----------¦----------¦----------¦
¦    qid   ¦    lid   ¦    ¦   owner  ¦   qid    ¦timestamp ¦
¦----------¦----------¦    ¦----------¦----------¦----------¦

我需要编写一个 SQL 语句,从表 2 中获取所有内容,其中所有者 = $uid,如果 qid 尚未在 table1 中列出,并且当前页面的 $lid。

我试过

SELECT * FROM table_two WHERE qid != (SELECT qid FROM table_one WHERE lid = " . $lid .") AND owner = " . $uid . ";

但没有快乐

有任何想法吗?

4

6 回答 6

8

这会起作用:

SELECT * 
FROM table_two 
WHERE qid not in (
    SELECT qid 
    FROM table_one 
    WHERE lid = " . $lid .") 

这可能会表现得更好:

SELECT T2.* 
FROM table_two t2
LEFT OUTER JOIN table_one T1 ON T2.QID = T1.QID 
    AND T1.LID = " . $lid ."
WHERE T1.qid IS NULL
于 2012-08-10T13:21:52.247 回答
3

您应该使用LEFT JOIN以获得最佳性能:

SELECT a.*
FROM table_two a
    LEFT JOIN table_one b
        ON a.qid = b.qid AND
           b.lid = " . $lid ."
WHERE b.qid IS NULL;

请参阅连接的视觉解释

于 2012-08-10T13:22:30.337 回答
1
SELECT * FROM table_two WHERE qid NOT IN (SELECT qid FROM table_one WHERE lid = " . $lid .")

使用NOT IN子句。这将为您提供不在您的subquery.

编辑 您也可以使用Left-Join, InMSSQL效率较低,但这是MySQL(我没有注意到),所以它们运行相同。你可以在这里看到

于 2012-08-10T13:21:53.250 回答
1
SELECT * FROM table_two WHERE qid not in 
    (SELECT qid FROM table_one WHERE lid = " . $lid .")
于 2012-08-10T13:22:00.950 回答
0

您建议使用:

SELECT * 
FROM table_two 
WHERE qid not in (
    SELECT qid 
    FROM table_one 
    WHERE lid = " . $lid .") 

我也得到了相同的prblm,但是当我用“notin”替换了它时,它对我有用

于 2012-08-21T10:05:55.903 回答
-1

我会说使用

SELECT * FROM table_two WHERE NOT EXISTS (SELECT NULL FROM table_one WHERE lid = " . $lid .")

使用 NOT EXISTS 子句将为您提供比 NOT IN 更好的查询计划。

于 2012-08-10T13:24:20.643 回答