如何选择查询的反转

时间:2013-07-06 20:44:26

标签: php mysql

您好我有三个表用于用户,一个用于用户服务,一个用于服务

  

Users表是(id,用户名,电子邮件,密码)

并且

  

服务表是(id,Servicename,Servicesdetails,price)

并且

  

userservices表是(id,userid,serviceid,startdate,enddate)

当用户登录他的仪表板时,他可以看到他拥有的所有服务。 他没有的服务。 对于他所有的服务,我使用了这个查询并且工作得很好。

$mysql_servicesadded = "SELECT * FROM services INNER JOIN userservices ON userservices.serviceid = services.id WHERE userservices.userid = '".$user."' ORDER BY userservices.startdate DESC";
$query_servicesadded = $dblink->query($m$mysql_servicesadded) or die ("Cannot Get Services");

然后获取它并回显它 但要获得所有服务用户没有我不知道使用什么查询。 请任何帮助

3 个答案:

答案 0 :(得分:4)

使用外部联接,它将为您选择所有服务

SELECT * 
FROM services 
LEFT OUTER JOIN userservices ON userservices.serviceid = services.id 
WHERE userservices.userid = '".$user."' 
ORDER BY userservices.startdate DESC";

如果您有来自userservices表的列的数据,则表示该数据已连接到该用户。如果你不这样做,它就没有连接。

然后从PHP中你可以迭代并检查它们。

答案 1 :(得分:2)

使用NOT EXISTS子查询:

SELECT
    * 
FROM 
    services
WHERE
NOT EXISTS(
SELECT
    userservices.serviceid
FROM
    userservices
WHERE
    userservices.serviceid = services.id 
AND
    userservices.userid = '".$user."'
)

http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

我认为,由于我们选择的服务没有附加到此用户,因此无需ORDER BY userservices.startdate。

答案 2 :(得分:1)

尝试使用类似的东西(注意NOT IN)。

SELECT * FROM services WHERE serviceid NOT IN 
(SELECT serviceid FROM userservices WHERE userid='".$user."') 
ORDER BY serviceid DESC

您也可以使用(NOT)EXISTS。