আমি কীভাবে কোনও প্রশ্নের মধ্যে "নট ইন" ব্যবহার করব?


26

শর্ত বিবরণী ব্যবহার করে 'নট ইন' ধারণকারী একটি কোয়েরি লেখার উপযুক্ত উপায় কী?

আমার জিজ্ঞাসাটি নিম্নলিখিতটি:

SELECT DISTINCT nid FROM node WHERE language NOT IN 
  (SELECT language 
    FROM languages WHERE language = 'ab');

আমি নিম্নলিখিত মত কিছু চেষ্টা করেছি:

$query->condition('n.' . $key, $value, 'not in (select language from 
  languages where language = $value)');

সম্ভবত আমি স্পষ্ট অনুপস্থিত, তবে আপনার জিজ্ঞাসা এবং এর মধ্যে পার্থক্য কি SELECT nid FROM node WHERE language != 'ab'?
Елин Й.

উত্তর:


38

নির্দিষ্ট উদাহরণে আপনার শর্তটি সহজভাবে এইভাবে লেখা উচিত:

$query->condition('n.language', 'ab', '<>');

জেনেরিক ক্ষেত্রে, যেখানে আপনাকে সাব-কোয়েরি থেকে ফিরে আসা মানগুলির ভিত্তিতে ডাটাবেসে সারি নির্বাচন করতে হবে, নিম্নলিখিত বিষয়গুলি আপনাকে বিবেচনা করা উচিত:

  • "নট ইন" অপারেটর হিসাবে গৃহীত হয় SelectQuery::condition()। আসলে, নিম্নলিখিত কোয়েরি কার্যকর করা হবে:

    $query = db_select('node', 'n')->fields('n');
    $query->condition('n.nid', array(1, 2, 3), 'NOT IN');
    $nodes = $query->execute();
    
    foreach ($nodes as $node) {
      dsm($node->nid);
    }
    
  • হিসাবে রিপোর্ট শর্তসাপেক্ষ ক্লজ ( "Subselects"), SelectQuery::condition()এছাড়াও একটি বস্তু বাস্তবায়নে গ্রহণ SelectQueryInterfaceজন্য মান হিসাবে $valueযেমন দ্বারা ফিরে এক হিসাবে, db_select(); সমস্যাটি হ'ল আসলে মানটি $operatorসমান হলে আপনি এটি ব্যবহার করতে পারেন "IN"। দেখুন Subselects যখন জন্য মান হিসেবে ব্যবহার ছাড়া DBTNG অবস্থায় কাজ করে না,

আমি সাব-কোয়েরিতে "নট ইন" অপারেটরটি দেখতে কেবলমাত্র উপায়টি conditionহ'ল:

  • একটি অ্যারে পেতে subquery চালানো
  • নিম্নলিখিত স্নিপেটের মতো শর্তটি নির্ধারণ করে মূল জিজ্ঞাসাটি কার্যকর করুন

    $query->condition($key, $subquery_result, 'NOT IN');

    $subquery_result সাব-কোয়েরির ফলাফল সহ অ্যারে is

অন্যথায়, আপনি where()অন্যরা যেমন বলেছিলেন তেমন ব্যবহার করতে পারেন , যা আপনার যুক্ত হওয়া ক্যোয়ারির অংশটির জন্য একটি স্ট্রিং গ্রহণ করে।

মনে রাখবেন যে db_select()ধীর হয় যে db_query(); আপনার প্রথমটি ব্যবহার করা উচিত যখন আপনি জানেন যে ক্যোয়ারীটি অন্য মডিউল দ্বারা পরিবর্তন করা যেতে পারে। অন্যথায়, যদি অন্য মডিউলগুলি hook_query_alter()আপনার ক্যোয়ারী পরিবর্তন করতে না পারে তবে আপনার ব্যবহার করা উচিত db_query()
নোডগুলি অ্যাক্সেস করার ক্ষেত্রে, যদি আপনার কেবলমাত্র নোডগুলি পেতে প্রয়োজন যেখানে কোনও ব্যবহারকারীর অ্যাক্সেস রয়েছে, তবে আপনাকে কোয়েরির ট্যাগ হিসাবে ব্যবহার করতে হবে db_select()এবং যুক্ত করতে হবে । উদাহরণস্বরূপ, নিম্নলিখিত কোড ব্যবহার করে।'node_access'SelectQuery::addTag()blog_page_last()

  $query = db_select('node', 'n')->extend('PagerDefault');
  $nids = $query
  ->fields('n', array('nid', 'sticky', 'created'))
    ->condition('type', 'blog')
    ->condition('status', 1)
    ->orderBy('sticky', 'DESC')
    ->orderBy('created', 'DESC')
    ->limit(variable_get('default_nodes_main', 10))
    ->addTag('node_access')
    ->execute()
    ->fetchCol();

অনুরূপ কোড ব্যবহার করে book_block_view()

$select = db_select('node', 'n')
  ->fields('n', array('title'))
  ->condition('n.nid', $node->book['bid'])
  ->addTag('node_access');
$title = $select->execute()->fetchField();

আমি যে কাস্টম ফিল্টারটি লিখেছি তার জন্য এখানে সাবকিয়ারের উদাহরণ রয়েছে: লিঙ্ক
রজার

1
"সাবলেটিকেশনগুলি ডিবিটিএনজি শর্তে কাজ করে না, আইএন এর মান হিসাবে ব্যবহার করা ব্যতীত" দ্রুপাল 8.3
জোনাথন

3

জটিল প্রশ্নগুলি লেখার সময় অবশ্যই আপনার db_query()পরিবর্তে ব্যবহার করা উচিত db_select()

  1. আপনি NOT INবর্তমান দ্রুপাল ডাটাবেস এপিআই দিয়ে একটি সাবকিউয়ের সাথে একটি ধারা লিখতে পারবেন না (এটি একটি জ্ঞানের সমস্যাটি তৈরি করা হচ্ছে)।
  2. আপনার যদি আপনার জিজ্ঞাসাকে গতিশীল হওয়ার প্রয়োজন না হয় (সুতরাং অন্যদের মডিউল দ্বারা পুনরায় লিখে দেওয়া হয়) তবে এ জাতীয় জটিলটি লেখার চেষ্টা করবেন নাdb_select()
  3. সাবকিউরিগুলি এখনও ভাল সমর্থিত নয় ( আমার একটি পূর্ববর্তী উত্তর দেখুন ) এবং আপনি এসকিউএল লিখতে ব্যবহার করেন তবে এটি ব্যবহারের উপায় সহজ db_query()

আপনার জিজ্ঞাসা সম্পর্কে, আমি নিশ্চিত না আপনি কেন একটি সাবকোয়ারি ব্যবহার করতে চান (যদি না আপনি আপনার উদাহরণটি সহজ করে দেন)? আপনি এটি সহজেই এটি লিখতে পারেন:

SELECT nid 
FROM node n INNER JOIN languages l ON n.language = l.language
WHERE language NOT IN ('ab')

DISTINCTnidপ্রাথমিক কী হিসাবে এটি প্রয়োজনীয় নয় তাই এটি সদৃশ হবে না।


2
# 2 সম্পর্কিত, ওপি নোডগুলি নির্বাচন করছে। AFAIK db_select () হ'ল প্রয়োজনীয় নোড_অ্যাক্সেস 'ট্যাগ সরবরাহ করার একমাত্র উপায়, এক্ষেত্রে db_select () একমাত্র পছন্দ হবে।
কিথ্ম

2

এছাড়াও রয়েছে যেখানে () যা ক্যোয়ারীতে শর্তটি একটি স্বেচ্ছাসেবী যুক্ত করতে দেয়।

উদাহরণ:

$query->where('n.language NOT IN (SELECT language FROMlanguages WHERE language = :lang)', array(':lang' => $value));

কিথম উল্লিখিত হিসাবে, আপনাকে অবশ্যই নোড নির্বাচন করার সময় অবশ্যই db_select () এবং addTag ('node_access') ব্যবহার করতে হবে যা ব্যবহারকারীদের জন্য প্রদর্শিত হবে।


1

সাবটাইটেল নোট-এর সাথে db_select ব্যবহারের একটি সহজ উপায় হ'ল অল্প পরিচিত use

$ Query-> যেখানে

একটি স্বেচ্ছাসেবী যেখানে শর্ত যোগ করতে।

উদাহরণ:

  // Count query for users without rid 3
  $query = db_select('users', 'u');
  $query->fields('u', array('uid'));
  $query->where('u.uid NOT IN(select uid from {users_roles} where rid = :rid)', array(':rid' => 3));  
  $count = $query->countQuery()->execute()->fetchField();
  drupal_set_message($count);

0

যেখানে সাবকিউয়ের ফলাফল হিসাবে ues subquery_values ​​$ key => $ nid বিন্যাসের একটি অ্যারে

$query->condition('node.nid', array_values($subquery_values), "NOT IN");

এটা ঠিক কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.