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

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

を使用する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 に答える