2017-01-24 6 views
0

MySQLクエリで部分一致または完全一致を見つける必要があります。私は 'OR'を使用して複数のテーブルでクエリを実行しており、すべての条件が満たされているかどうかを知る必要があります。複数の "OR"でMySQLクエリの部分一致を見つける

これを行う最も簡単な方法は、「部分的」という新しい列を作成することです(0または1のいずれかになります)。

ここ

は私のクエリです:

SELECT 
    id, confirmed, name, addressLine1, addressLine2, addressCity, addressPostcode, 
    addressLat, addressLon, 
    (6371 * acos(cos(radians('53.649779')) 
       * cos(radians(addressLat)) 
       * cos(radians(addressLon) - radians('-1.6026266')) 
       + sin(radians('53.649779')) * sin(radians(addressLat))) 
) distance 
FROM TABLE_NAME 
WHERE active = '1' 
    AND deleted = '0' 
    AND 
    (
    id < 0 
    OR 
    id IN 
    (
     SELECT establishmentID 
     FROM appEstablishmentDrinks 
     WHERE active = '1' 
     AND deleted = '0' 
     AND manufacturerDrinkID IN (101) 
     GROUP BY establishmentID 
     HAVING count(distinct manufacturerDrinkID) = 1 
    ) 
    OR 
    id IN 
    (
     SELECT establishmentID 
     FROM appEstablishmentFacilities 
     WHERE active = '1' 
     AND deleted = '0' 
     AND facilityID IN (37) 
    ) 
) 
HAVING distance < '15' 
+0

あなたのような文で取得したデータを延長することができる:IF(sqlCondition1、1、0)partial1 AS、IF(sqlCondition2、1、0)partial2 –

答えて

2
のMySQLでは

true = 1とfalse = 0だから、単純に条件を追加します。(id < 0) + (id in (...)) + (id in (...))、あなたはすべての3試合以下を得たかどうかを確認してください。

SELECT 
    id, confirmed, name, addressLine1, addressLine2, addressCity, addressPostcode, 
    addressLat, addressLon, distance, 
    case when count_matches = 3 then 'full' else 'partial' end as matching 
FROM 
(
    SELECT 
    id, confirmed, name, addressLine1, addressLine2, addressCity, addressPostcode, 
    addressLat, addressLon, 
    (6371 * acos(cos(radians(53.649779)) 
       * cos(radians(addressLat)) 
       * cos(radians(addressLon) - radians(-1.6026266)) 
       + sin(radians(53.649779)) * sin(radians(addressLat))) 
    ) as distance, 
    (id < 0) 
    + 
    (
     id IN 
     (
     SELECT establishmentID 
     FROM appEstablishmentDrinks 
     WHERE active = 1 
      AND deleted = 0 
      AND manufacturerDrinkID IN (101) 
     GROUP BY establishmentID 
     HAVING count(distinct manufacturerDrinkID) = 1 
    ) 
    ) 
    + 
    (
     id IN 
     (
     SELECT establishmentID 
     FROM appEstablishmentFacilities 
     WHERE active = 1 
     AND deleted = 0 
     AND facilityID IN (37) 
    ) 
    ) as count_matches 
    FROM TABLE_NAME 
    WHERE active = 1 
    AND deleted = 0 
) x 
WHERE distance < 15 
AND count_matches > 0; 
+0

こんにちはAS。お返事をありがとうございます。データベース内でこのコードを実行しようとしましたが、次のエラーが表示されています。#1064 - SQL構文にエラーがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックし、正しい構文が第2行の 'id、confirmed、name、addressLine1、addressLine2、addressCity、addressPostcode'の近くで使用されるようにしてください。 –

+0

typo。 'SELECT * id、confirmed、...、'はもちろん無効です。そのエラーを自分で見つけられませんでしたか? "近所の" id ... "は、どこを見ているかをかなり説明しています。私は '*'を今削除しました。もう一度お試しください。おかげさまで –

+0

私はそれを気付いて、それだけで*と*を除いて、それを試しましたが、すべての列名はまだ運がありませんでした。エラーが表示されます:#1064 - SQL構文にエラーがあります。 (id <0)+(id IN(SELE 'in line 14) –

関連する問題