根据条件SQL连接两个表

问题描述

我正在构建使用地理位置的android应用。我正在尝试改善整体应用程序,以提高运行时的平滑度。我正在使用volly连接到我的网络服务器上的php页面,然后该php页面可以访问我的phpmyadmin数据库。我的用于更新位置的php页面一团糟,我希望可以使用正确的sql查询将其修复。

让我们开始吧。

所以我有一个名为users的表

enter image description here

和一个名为friends的表

enter image description here

在这个特定的例子中,大卫是马克和杰克的朋友。另外要弄清楚马克和杰克是大卫的朋友。

我需要做的是编写一个查询,如果给定用户ID,例如说3,它将生成该人及其朋友ID,cordsV1,cordsV2的表,而该表中没有任何重复的ID。

我能够使用循环和变量ect来使它工作,但是正如我所说的那样,这是一个可怕的烂摊子。

这是我目前所有的SQL查询尝试:

SELECT DISTINCT ID,cordsV1,cordsV2 FROM `friends`,`users` WHERE user_one_ID = 1 AND status = 1;

但是,这只会返回用户表中的所有用户ID。我对sql真的很不好,所以如果有人能指出正确的方向,那将不胜感激。

如果您想知道的话,这是我可怕的代码:

<?php error_reporting(E_ALL | E_STRICT); ?>
<?php 
$THIS_USER_ID = $_GET['THIS_USER_ID'];


try {
    $one = 1;
    $db = new PDO("");
    $sql =  "SELECT * FROM   friends   WHERE  user_one_ID = '" . $THIS_USER_ID . "' AND status = '" . $one . "' OR user_two_ID = '" . $THIS_USER_ID . "' AND status = '" . $one . "'";


  
    $rows = $db->query($sql)
            ->fetchAll(PDO::FETCH_ASSOC);

    $printMe = [];

    foreach($rows as $row){
        $printMe[] = $row;
    }

    
    $jsonArr = json_encode($printMe);
    $characters = json_decode($jsonArr,true);


    
    // Getting the size of the sample array 
    $size = sizeof($characters); 
    $neg = -1;
    $sql2 = "SELECT * FROM   users   WHERE  ID = '" . $neg . "'";
    $sql3 = "";
    $sql4 = "";
    for ($x = 0; $x < $size; $x++ ){
        if ($characters[$x]['user_one_ID'] == $THIS_USER_ID && $characters[$x]['status'] == 1){
            $hold = $characters[$x]['user_two_ID'];
            $sql3 = $sql3 . " OR ID = '" . $hold . "'";

        } else if($characters[$x]['user_two_ID'] == $THIS_USER_ID && $characters[$x]['status'] == 1) {
            $hold = $characters[$x]['user_one_ID'];
            $sql4 = $sql4 . " OR ID = '" . $hold . "'";
        }
    }

    
    
    $sql5 = $sql2 . $sql3 . $sql4;

    $sql7 = "SELECT * FROM   users   WHERE  ID = '" . $THIS_USER_ID . "'";
    $printMe2 = [];
    $rows3 = $db->query($sql7)
    ->fetchAll(PDO::FETCH_ASSOC);

    foreach($rows3 as $row3){
        $printMe2[] = $row3;
    }


    $rows2 = $db->query($sql5)
            ->fetchAll(PDO::FETCH_ASSOC);


    foreach($rows2 as $row2){
        $printMe2[] = $row2;
    }

    $jsonArr2 = json_encode($printMe2);

    echo $jsonArr2;

    $db = null;


} catch(PDOException $ex) {
    die(json_encode(array('outcome' => false,'message' => 'Unable to connect')));
}
?>

解决方法

获取用户数据

SELECT
    *
FROM
    users
WHERE ID = ?

获取朋友的用户数据

SELECT
    users.*
FROM
    friends
JOIN
    users ON users.ID = friends.user_two_ID
WHERE
    friends.user_one_ID = ?

最好使用prepared statements,否则由于SQL-Injections,您的应用将无法正常运行。

您还想看看meaningful names

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...