php多表条件排除输出,php – 从具有多个要求的两个表中选择值,但仅使用其中一个...

免责声明:以下答案很长,所以我首先会引起你的注意,说最后的查询会产生符合你想要的结果.这是

SQL Fiddle.

那么,在我看来,解决这个问题的最佳方法是一次一个要求.

I want to use only Prefix and Destination columns of table A.

这只是一个简单的选择语句:

SELECT a.prefix,a.destination

FROM tableA a;

I want to use only rate column of table B.

我们也可以轻松添加它.请注意,我现在所拥有的只是创建一个笛卡尔积,但随着我们添加更多要求,它将会理顺:

SELECT a.prefix,a.destination,b.rate

FROM tableA a,tableB b;

If Prefix of table A = Prefix of table B,then copy rate.

我更改了上面的内容,在select子句中使用相关子查询,如果它具有与tableA匹配的前缀,则会提取速率.对于任何不匹配的值,这将为null(暂时):

SELECT a.prefix,(SELECT b.rate FROM tableB b WHERE b.prefix = a.prefix) AS rate

FROM tableA a;

If prefix of table A is not found in table B,then copy rate of prefix in table B that starts with prefix of table A (return only the longest string’s value).

为此,我离开了一秒钟,写了一个查询,从B获取前缀从表A开始的B的速率,忘记了先前的条件.我像你一样使用了substring函数,但是按照长度的降序排序得到最大的一个:

SELECT a.prefix,(SELECT b.rate FROM tableB b WHERE b.prefix =

SUBSTRING(a.prefix,LENGTH(b.prefix)) ORDER BY LENGTH(b.prefix) DESC LIMIT 1) AS rate

FROM tableA a;

现在,您可以获取该选择查询及其上方的查询,并使用COALESCE函数获取第一个非空值.因此,返回空值的步骤3中的值将替换为步骤4的值(如果仍有非空值):

SELECT a.prefix,COALESCE(

(SELECT b.rate FROM tableB b WHERE b.prefix = a.prefix),(SELECT b.rate FROM tableB b WHERE b.prefix = SUBSTRING(a.prefix,LENGTH(b.prefix)) ORDER BY LENGTH(b.prefix) DESC LIMIT 1)) AS rate

FROM tableA a;

If prefix of table A is not in table B then copy rate of prefix in table B where prefix of table A starts with a prefix in table B. (return only longest string’s value).

好吧,除了操作子查询以检查相反的表之外,我们可以做与上一次相同的操作.此外,COALESCE函数没有参数限制,因此我们可以将其添加为第三个参数.如果第一个返回null,它将尝试第二个.如果返回null,它将尝试第三个.这是最后的查询:

SELECT a.prefix,LENGTH(b.prefix)) ORDER BY LENGTH(b.prefix) DESC LIMIT 1),(SELECT b.rate FROM tableB b WHERE a.prefix = SUBSTRING(b.prefix,LENGTH(a.prefix)) ORDER BY LENGTH(a.prefix) DESC LIMIT 1)) AS rate

FROM tableA a;

当我将结果与你的结果进行比较时,我注意到上面没有考虑到4和5都满足,在这种情况下我们想要采用最长的前缀.虽然可能有更简洁的方法来编写它,但我只写了以下case语句:

SELECT a.prefix,CASE WHEN

(SELECT b.rate FROM tableB b WHERE b.prefix = a.prefix) IS NOT NULL

THEN

(SELECT b.rate FROM tableB b WHERE b.prefix = a.prefix)

ELSE

CASE WHEN

((SELECT b.rate FROM tableB b WHERE b.prefix = SUBSTRING(a.prefix,LENGTH(b.prefix)) ORDER BY LENGTH(b.prefix) DESC LIMIT 1) IS NOT NULL)

AND

((SELECT b.rate FROM tableB b WHERE a.prefix = SUBSTRING(b.prefix,LENGTH(a.prefix)) ORDER BY LENGTH(a.prefix) DESC LIMIT 1) IS NOT NULL)

THEN

CASE WHEN

(SELECT LENGTH(b.prefix) FROM tableB b WHERE b.prefix = SUBSTRING(a.prefix,LENGTH(b.prefix)) ORDER BY LENGTH(b.prefix) DESC LIMIT 1)

>

(SELECT LENGTH(a.prefix) FROM tableB b WHERE a.prefix = SUBSTRING(b.prefix,LENGTH(a.prefix)) ORDER BY LENGTH(a.prefix) DESC LIMIT 1)

THEN

(SELECT b.rate FROM tableB b WHERE b.prefix = SUBSTRING(a.prefix,LENGTH(b.prefix)) ORDER BY LENGTH(b.prefix) DESC LIMIT 1)

ELSE

(SELECT b.rate FROM tableB b WHERE a.prefix = SUBSTRING(b.prefix,LENGTH(a.prefix)) ORDER BY LENGTH(a.prefix) DESC LIMIT 1)

END

ELSE

COALESCE(

(SELECT b.rate FROM tableB b WHERE b.prefix = SUBSTRING(a.prefix,LENGTH(a.prefix)) ORDER BY LENGTH(a.prefix) DESC LIMIT 1))

END

END AS rate

FROM tableA a;

它背后的逻辑有点像:

>检查是否符合条件3.

>如果是,请使用该值.

>检查是否满足条件4和5.

>如果是,请检查条件4中的前缀是否更长.

>如果是,请使用它.如果不是,请使用条件5中的前缀.

>如果不是,请从条件4和5中选择第一个非空条件.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值