Table1
id | username | request
--------|--------------|----------
1 | user 1 | blah blah
2 | user 1 | blah2
3 | user 1 | blah3
4 | user 1 | blah4
5 | user 2 | blah1
Table2
id | username | requestID
--------|--------------|------------
1 | user 2 | 1
“用户2”的返回结果应为:
table1.id = 2
table1.id = 3
table1.id = 4
我需要创建一个选择,从第一个表中选择用户名<>的所有ID $ username(这很容易)。
我还需要将这个匹配到表2,以确保$ username没有表1中与表2中的RequestID相匹配的id(这是我不知道该怎么做的地方)。
我知道如何进行内连接,但这看起来有点复杂。我是否一起加入两种不同的选择?我该怎么做?
现有代码:
$stmt=$db->prepare("SELECT id FROM table1 WHERE username <> :user");
$stmt->bindParam(':user', $username);
$stmt->execute();
$row = $stmt->fetch();
添加问题
我尝试了一个内连接,它只是在第二个WHERE子句上返回一个错误:'where子句'中的未知列'table2.username'..但是查看表清楚地有一个用户名列。
$stmt=$db->prepare("SELECT table1.id
FROM table1
INNER JOIN table2
ON table1.id = table2.requestID
WHERE table1.username <> 'user 1'
AND table2.username = 'user 1'");
添加更多内容以使其更清晰
我不相信简单的INNER JOIN会像我最初说的那样解决我的问题。我需要先从table1获得结果。然后我需要针对table2测试那些结果,以便仅返回当前用户的table1 NOT MADE的结果,并返回那些返回的结果,只返回用户未在table2中列出的结果。
所以我猜我只需要完成两个完全独立的数据库功能。
$stmt=$db->prepare("SELECT id FROM table1 WHERE username <> :user");
$stmt->bindParam(':user', $username);
$stmt->execute();
$row = $stmt->fetch();
$id = $row['id'];
$stmt=$db->prepare("SELECT requestID FROM table1 WHERE username = :user");
$stmt->bindParam(':user', $username);
$stmt->bindParam(':id', $id);
$stmt->execute();
$rid = $stmt->fetch();
if $rid !== $id { //perform function } else {}
我认为有一种方法可以复合select语句,所以我不需要做两个不同的调用,但也许我错了。无论哪种方式,我都没有看到内部联接将如何实现这一目标...但我乐于学习。
还有更多更新,试图让这个更加清晰
table1.id = 1不匹配,因为用户2的table2.requestID与table1.id匹配; table1.id = 5不匹配,因为用户2是table1.id = 5
的列出用户名但是其他3列应该返回。
答案 0 :(得分:1)
你可以使用IN
来完成<android.support.design.widget.AppBarLayout
android:id="@+id/apbarlayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsingToolbarLayout"
android:layout_width="match_parent"
android:layout_height="250dp"
android:background="#000000"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerInside"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.7"/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="150dp"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
或使用左连接
SELECT table1.id
FROM table1
WHERE table1.username <> 'user 2'
and NOT table1.id IN (SELECT requestid FROM table2 WHERE username = 'user 2')
我不知道哪一个更好,但结果相同
答案 1 :(得分:0)
使用条款on
试试这个
SELECT table1.id
FROM table1
INNER JOIN table2
ON table1.id = table2.requestID and table2.username = 'user 1'
WHERE table1.username <> 'user 1'