PHP PDO MYSQL复合选择语句

时间:2016-08-30 04:57:07

标签: php mysql pdo

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列应该返回。

2 个答案:

答案 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'