加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 选择链接表中缺少的行

发布时间:2020-12-13 17:14:00 所属栏目:PHP教程 来源:网络整理
导读:我有3张桌子.一个是服务表.每个服务都可以有一些选项,这些选项位于选项表中.第三个表是链接到每个选项的联系人列表. 所以,表格如下所示: 服务 serviceID 100 101 选项 optionID serviceID price 1 100 10.5 2 100 100 3 101 25.25 4 101 67.90 contactOptio
我有3张桌子.一个是服务表.每个服务都可以有一些选项,这些选项位于选项表中.第三个表是链接到每个选项的联系人列表.

所以,表格如下所示:

服务

serviceID
   100
   101

选项

optionID    serviceID    price
    1         100        10.5
    2         100        100
    3         101        25.25
    4         101        67.90

contactOptions

contactID     optionID     serviceID     priceOverride
    10            1           100              NULL
    10            2           100              NULL
    10            3           101              30
    10            4           101              100
    11            1           100              12
    11            3           101              NULL
    12            2           100              55
    12            3           101              NULL
    12            4           101              NULL
    13            1           100              NULL
    13            2           100              66
    13            4           101              NULL

正如您所看到的,contactID 10具有与他链接的所有4个选项. 11只有2只与她联系,12只和13只都有3只.

我试图找到一种方法来获取没有所有4个选项的contactID,以及缺少哪些选项.

我试过(SQL Fiddle:http://sqlfiddle.com/#!2/ca937/7):

SELECT *
FROM contactOptions
LEFT JOIN options
  ON options.optionID = contactOptions.optionID
  AND options.serviceID = contactOptions.serviceID

但这只会让我返回所有12行,我想要相反的,不存在的行.

如何退回没有全部4个选项的联系人以及他们没有的选项?

返回的行应该是:

contactID    optionID    serviceID
  11           2            100
  11           4            101
  12           1            100
  13           3            101

我最终想知道哪些服务(以及哪些选项)没有链接到它们的联系人.

编辑:我一直在靠近,这就是我现在拥有的

SELECT contactID,contactOptions.serviceID,contactOptions.optionID AS x,options.optionID AS y
FROM contactOptions
JOIN options
  ON options.serviceID = contactOptions.serviceID
HAVING x != y

这是我目前的SQL小提琴:http://sqlfiddle.com/#!2/ca937/35

返回:

CONTACTID    SERVICEID    X    Y
  10           100        1    2
  10           100        2    1
  10           101        3    4
  10           101        4    3
  11           100        1    2
  11           101        3    4
  12           100        2    1
  12           101        3    4
  12           101        4    3
  13           100        1    2
  13           100        2    1
  13           101        4    3

这包含我想要的行,但它也包含我不想要的行.从这个结果我基本上需要删除联系人具有相同的X和Y值的所有行,然后剩下的行是正确的.

编辑2:我现在更近了(http://sqlfiddle.com/#!2/ca937/53):

SELECT contactID,options.optionID AS y
FROM contactOptions
JOIN options
  ON options.serviceID = contactOptions.serviceID
GROUP BY contactID,serviceID
HAVING x != y

这给了我:

CONTACTID    SERVICEID    X    Y
  12            100       2    1
  13            101       4    3

现在我有2个我想要的行.我只需要弄清楚如何获取11行.

解决方法

SELECT contacts_options_full.contactID,contacts_options_full.optionID,options.serviceID
FROM
(
  SELECT contactID,optionID
  FROM (SELECT optionID FROM options) o
  CROSS JOIN
  (SELECT DISTINCT contactID FROM contactOptions) co
) contacts_options_full
LEFT JOIN contactOptions ON contacts_options_full.contactID = contactOptions.contactID
AND contactOptions.optionID = contacts_options_full.optionID
JOIN options ON contacts_options_full.optionID = options.optionID
WHERE contactOptions.serviceID IS NULL
ORDER BY contacts_options_full.contactID,contacts_options_full.optionID

在sqlfiddle

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读