1

在这里摆弄桌子

我正在使用以下 sql 和小提琴中的表来检查用户是否已达到借用限制。这里的问题是,如果提供了无效的项目编号,则返回 NULL,如果用户没有借过任何项目,则返回 NULL。这样,我无法判断是否提供了无效的项目编号,或者用户是否实际上没有借过任何书籍。检查是否提供了无效的项目编号或成员实际上没有在该类别下借任何东西的好方法是什么?

set @mId = 3 //Has not borrowed anything till now.
set @id = 21; //This item does not appear in the collection_db table and is therefore invalid.
set @country = 'US';

SELECT col1.id, col1.holder, col2.borrowMax maxLimit, count(lend.borrowedId) as `count`
FROM collection_db col1
  INNER JOIN collection_db col2
  ON col1.holder = col2.id
    INNER JOIN lendings lend
    ON col1.holder = lend.holder and col1.country = lend.country
WHERE col1.id = @id and col1.country = @country
AND col2.category = 10
AND lend.memId = @mId and lend.country = @country
4

3 回答 3

1

我可以通过一个查询获得的最远距离是(必须取出 php 和“国家”变量才能使小提琴工作):

SELECT col1.id, col1.holder, col2.borrowMax maxLimit, count(lend.borrowedId) as `count`
,case when valid1.id is not null then 'true' else 'false' end as validId
FROM collection_db col1
  INNER JOIN collection_db col2
  ON col1.holder = col2.id
    INNER JOIN lendings lend
    ON col1.holder = lend.holder,(
        Select Distinct a.id From collection_db a
        Where a.id = 4) valid1
WHERE col1.id = 4
AND col2.category = 10
AND lend.memId = 1

您可能需要对有效的 memId 进行准备性查询检查:

$theQuery = "SELECT DISTINCT memId FROM lendings WHERE memId = 1"

然后在这里测试它:

if (mysql_num_rows(mysql_query($theQuery)) <= 0) { /* No memId exists */ }
else { /* Do big query here */ }
于 2013-05-24T13:52:47.477 回答
0

您可以使用 a tableA LEFT JOIN tableB,即使 tableB 没有匹配项,它也会返回 tableA 的结果,并且将为 tableB 中的那些返回 NULL 值。

不幸的是,我不太清楚你在哪里需要 LEFT JOINS,但可能你在两个地方都需要它们。

如果它是第一个应该位于 LEFT JOIN 右侧的表,您还可能需要重新排序这些表。您可以使用 RIGHT JOIN 但它对我来说不太可读。

于 2013-05-24T08:29:27.950 回答
0

如果 col1 没有太多数据,也许您应该尝试“左连接”,或者逐步进行查询

于 2013-05-24T08:30:16.550 回答