আমার মতামত আছে:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = 2;
আমি এটিকে আরও জেনেরিক করে তুলতে চাই, এর অর্থ ২ টি ভেরিয়েবলে পরিবর্তন করা। আমি এটি চেষ্টা করেছি:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = @MyVariable;
তবে মাইএসকিউএল এটির অনুমতি দেয় না।
আমি একটি কুরুচিপূর্ণ কাজ পেয়েছি:
CREATE FUNCTION GetMyVariable() RETURNS INTEGER DETERMINISTIC NO SQL
BEGIN RETURN @MyVariable; END|
এবং তারপরে ভিউটি হ'ল:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = GetMyVariable();
তবে এটি দেখতে আসলেই কৃপণ, এবং ব্যবহারটিও কৃপণ - প্রতিটি ভিউয়ের ব্যবহারের আগে আমাকে @ মাই ভার্ভেয়েবল সেট করতে হবে।
এমন কোনও সমাধান আছে যা আমি এই জাতীয়ভাবে ব্যবহার করতে পারি:
SELECT Column FROM MyView(2) WHERE (...)
কংক্রিট পরিস্থিতি নিম্নরূপ: অস্বীকৃত অনুরোধ সম্পর্কে আমার কাছে একটি সারণী তথ্য রয়েছে:
CREATE TABLE Denial
(
Id INTEGER UNSIGNED AUTO_INCREMENT,
PRIMARY KEY(Id),
DateTime DATETIME NOT NULL,
FeatureId MEDIUMINT UNSIGNED NOT NULL,
FOREIGN KEY (FeatureId)
REFERENCES Feature (Id)
ON UPDATE CASCADE ON DELETE RESTRICT,
UserHostId MEDIUMINT UNSIGNED NOT NULL,
FOREIGN KEY (UserHostId)
REFERENCES UserHost (Id)
ON UPDATE CASCADE ON DELETE RESTRICT,
Multiplicity MEDIUMINT UNSIGNED NOT NULL DEFAULT 1,
UNIQUE INDEX DenialIndex (FeatureId, DateTime, UserHostId)
) ENGINE = InnoDB;
একটি বহুবৃত্তি হ'ল একই সেকেন্ডে রেকর্ড করা অভিন্ন অনুরোধের একটি সংখ্যা। আমি অস্বীকারের একটি তালিকা প্রদর্শন করতে চাই, তবে কখনও কখনও, যখন অ্যাপ্লিকেশনটি অস্বীকার হয়ে যায়, এটি নিশ্চিত করার জন্য এটি কয়েকবার চেষ্টা করে। সুতরাং সাধারণত, একই ব্যবহারকারী যখন কয়েক সেকেন্ডে একই বৈশিষ্ট্যটিতে 3 বার অস্বীকৃতি পান তখন এটি আসলে একটি অস্বীকার। এই অনুরোধটি পূরণ করতে যদি আমাদের আরও একটি সংস্থান থাকে তবে পরবর্তী দুটি অস্বীকৃতি ঘটবে না। সুতরাং আমরা প্রতিবেদনে অস্বীকারগুলি গোষ্ঠী করতে চাই যাতে ব্যবহারকারীকে টাইমস্প্যানটি নির্দিষ্ট করতে দেয় যাতে অস্বীকারগুলি গোষ্ঠীভুক্ত করা উচিত। উদাহরণস্বরূপ, যদি টাইমস্ট্যাম্পগুলিতে আমাদের অস্বীকার (বৈশিষ্ট্য 1 তে ব্যবহারকারী 1 এর জন্য) থাকে: 1,2,24,26,27,45 এবং ব্যবহারকারী 4 টি সেকেন্ডের চেয়ে একে অপরের নিকটে থাকা অস্বীকৃতিগুলি গ্রুপ করতে চায়, তার এই জাতীয় কিছু পাওয়া উচিত: 1 (এক্স 2), 24 (এক্স 3), 45 (এক্স 1)। আমরা ধরে নিতে পারি, প্রকৃত অস্বীকারগুলির মধ্যে ফাঁকগুলি সদৃশগুলির মধ্যে অনেক বড়।
CREATE FUNCTION GetDenialMergingTime()
RETURNS INTEGER UNSIGNED
DETERMINISTIC NO SQL
BEGIN
IF ISNULL(@DenialMergingTime) THEN
RETURN 0;
ELSE
RETURN @DenialMergingTime;
END IF;
END|
CREATE VIEW MergedDenialsViewHelper AS
SELECT MIN(Second.DateTime) AS GroupTime,
First.FeatureId,
First.UserHostId,
SUM(Second.Multiplicity) AS MultiplicitySum
FROM Denial AS First
JOIN Denial AS Second
ON First.FeatureId = Second.FeatureId
AND First.UserHostId = Second.UserHostId
AND First.DateTime >= Second.DateTime
AND First.DateTime - Second.DateTime < GetDenialMergingTime()
GROUP BY First.DateTime, First.FeatureId, First.UserHostId, First.Licenses;
CREATE VIEW MergedDenials AS
SELECT GroupTime,
FeatureId,
UserHostId,
MAX(MultiplicitySum) AS MultiplicitySum
FROM MergedDenialsViewHelper
GROUP BY GroupTime, FeatureId, UserHostId;
তারপরে 3 এবং 4 বৈশিষ্ট্যগুলিতে 1 এবং 2 ব্যবহারকারীর কাছ থেকে অস্বীকারগুলি দেখাতে প্রতি 5 সেকেন্ডে একীভূত করা আপনাকে যা করতে হবে তা হ'ল:
SET @DenialMergingTime := 5;
SELECT GroupTime, FeatureId, UserHostId, MultiplicitySum FROM MergedDenials WHERE UserHostId IN (1, 2) AND FeatureId IN (3, 4);
আমি দৃশ্যটি ব্যবহার করি কারণ এর মধ্যে ডেটা ফিল্টার করা সহজ এবং এটি jQuery গ্রিডে স্পষ্টভাবে ব্যবহার করা, স্বয়ংক্রিয়ভাবে অর্ডার করা, রেকর্ডের সংখ্যা সীমাবদ্ধ করা ইত্যাদি and
তবে এটি কেবল একটি কুরুচিপূর্ণ কাজ। এটি করার কোনও সঠিক উপায় আছে কি?