رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
واکشی ده محصول از هر دسته با یک کوئری
#1
سلام بر مهندسین.
من دو تا جدول دارم که تو یکی دسته ها و در جدول دوم هم محصولات ذخیره شده است. هر محصول هم یه دسته داره. یعنی در واقع کلید اصلی جدول دسته در جدول محصولات به صورت کلید خارجی تعریف شده.

جدول محصولات هم شامل محصولات متعددی هست. من میخوام از هر دسته ده تا محصول بکشم بیرون. میخوام این کار رو با یه کوئری انجام بدم ولی نمیدونم چطور باید کوئری رو بنویسم. به صورت تک تک میتونم این کارو کنم، اما توسط این روش به تعداد هر دسته باید کوئری بزنم که این مدنظر من نیست.

چطور میتونم یه کوئری (فقط یه کوئری) بنویسم و با اون ده تا محصول از هر دسته رو واکشی کنم؟؟؟

ممنونم میشم اگه کسی راهنمایی کنه.
پاسخ
تشکر شده توسط:
#2
توی MySQL امکان تعیین محدودیت برای هر گروه به تفکیک وجود نداره. روشهای جایگزین و با کمک متغیر و... هست ولی بهترین کار استفاده از کوئریهای جداگانه است.
پاسخ
تشکر شده توسط:
#3
یعنی واقعا راهی نداره با استفاده از یه کوئری؟؟؟
اینطوری به تعداد دسته ها باید کوئری زد. کمی غیر بهینه میشه.
پاسخ
تشکر شده توسط:
#4
(01-07-1394، 10:57 ق.ظ)MehrdadSalahi نوشته: یعنی واقعا راهی نداره با استفاده از یه کوئری؟؟؟
اینطوری به تعداد دسته ها باید کوئری زد. کمی غیر بهینه میشه.
سلام؛ من قبلاً به مسئله ای مثل شما برخورد کردم و این کوئری رو براش نوشتم. البته متأسفانه الان وقت اش رو ندارم براتون توضیح بدهم ولی براتون جداول و کوئری رو گذاشتم. اگه احیاناً مشکل تون حل نشود و یا اینکه ابهامی داشتید بفرمائید در اولین فرصت توضیح می دهم. 





CREATE DEFINER=`root`@`localhost` PROCEDURE `sp-test`(IN `_Limitation` INT)
    NO SQL
begin

SELECT A.ID as learnID,A.Title AS learnTitle,
        B.GroupID AS TutGroupID,B.ID AS TutID,
        B.Title AS tutTitle,B.RowNumber
 
 FROM tbgrouplearn AS A
 LEFT JOIN 
 
 (SELECT @row_num := IF(@prev_value=o.GroupID,@row_num+1,1) AS RowNumber
   ,o.ID 
   ,o.GroupID 
   ,o.Title
 ,@prev_value := o.GroupID
 
 FROM tbtutorial o,
  (SELECT @row_num := 1) x,
  (SELECT @prev_value := '') y
  ORDER BY o.GroupID, o.DateUpdate DESC) B  
  ON A.ID = B.GroupID
 WHERE RowNumber>0 And RowNumber<_Limitation;

end$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp-test2`(IN `_Limitation` INT)
    NO SQL
begin

SELECT A.ID as learnID,A.Title AS learnTitle,A.GroupID,
        B.GroupID AS TutGroupID,B.ID AS TutID,
        B.Title AS tutTitle,B.PathPic,B.RowNumber
 
 FROM tbgrouplearn AS A
 LEFT JOIN 
 
 (SELECT @row_num := IF(@prev_value=o.GroupID,@row_num+1,1) AS RowNumber
   ,o.ID 
   ,o.GroupID 
   ,o.Title
   ,o.PathPic
 ,@prev_value := o.GroupID
 
 FROM tbtutorial o,
  (SELECT @row_num := 1) x,
  (SELECT @prev_value := '') y
  ORDER BY o.GroupID, o.DateUpdate DESC) B  
  ON A.ID = B.GroupID
 WHERE RowNumber>0 And RowNumber<_Limitation;

end$$

DELIMITER ;

-- --------------------------------------------------------

--
-- Table structure for table `tbgrouplearn`
--

CREATE TABLE IF NOT EXISTS `tbgrouplearn` (
`ID` int(11) NOT NULL,
  `Title` varchar(255) COLLATE utf8_bin NOT NULL,
  `DateUpdate` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='دسته بندی مطالب';

--
-- Dumping data for table `tbgrouplearn`
--

INSERT INTO `tbgrouplearn` (`ID`, `Title`, `DateUpdate`) VALUES
(1, 'tit-1', 1440746677),
(2, 'tit-2', 1440746677),
(3, 'tit-3', 1440746677);

-- --------------------------------------------------------

--
-- Table structure for table `tbtutorial`
--

CREATE TABLE IF NOT EXISTS `tbtutorial` (
`ID` int(11) NOT NULL,
  `GroupID` int(11) NOT NULL,
  `Title` varchar(255) COLLATE utf8_bin NOT NULL,
  `DateUpdate` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='مطالب اصلی سایت';

--
-- Dumping data for table `tbtutorial`
--

INSERT INTO `tbtutorial` (`ID`, `GroupID`, `Title`, `DateUpdate`) VALUES
(3, 1, 'tit1- Matn 1', 1440837718),
(4, 1, 'tit1- Matn 2', 1440837180),
(5, 1, 'tit1- Matn 3', 1440837448),
(6, 3, 'tit3- Matn 1', 1440837861),
(7, 3, 'tit3- Matn 2', 1441007336),
(8, 1, 'tit1- Matn 4', 1440837935),
(26, 2, 'tit2- Matn 1', 1441007090),
(27, 2, 'tit2- Matn 2', 1441007198);

--
-- Indexes for dumped tables
--

--
-- Indexes for table `tbgrouplearn`
--
ALTER TABLE `tbgrouplearn`
 ADD PRIMARY KEY (`ID`);

--
-- Indexes for table `tbtutorial`
--
ALTER TABLE `tbtutorial`
 ADD PRIMARY KEY (`ID`), ADD KEY `GroupID` (`GroupID`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `tbgrouplearn`
--
ALTER TABLE `tbgrouplearn`
MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=21;
--
-- AUTO_INCREMENT for table `tbtutorial`
--
ALTER TABLE `tbtutorial`
MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=28;
پاسخ
تشکر شده توسط:
#5
غیر بهینه نیست. خودتون به روش دوستمون نگاه کنید: کلی متغیر باید آپدیت بشه و با بنچمارک هم مشخص میشه که کندتر از روش کوئری جداگانه است. یه foreach میخواین بذارین دیگه! اینقدر توی بهینگی سخت نگیرین. خیلی وقتها کار بهینه یعنی کاری که کمتر باعث میشه توی کدنویسی سردرد بگیرین. یکم از قدرت سخت افزاری اون هاستی که پولشو دادین استفاده کنید نگذارین CPU سیستمشون ول بگرده و نون مفت بخوره.
پاسخ
تشکر شده توسط: minoo
#6
جناب مهندس متشکرم!!! حرف حق جواب نداره.
خانم مینو از جوابتون متشکرم. ولی این کد سنگینه. این روش رو می‌تونم تا حدی پیاده‌سازی کنم. این مورد مدنظر من نبود. من می‌خواستم با همون دستورات سلکت ساده و Groupby و اینا مسئله رو حل کنم که خودم به نتیجه نرسیدم. مهندس هم که استاد بنده هستن گفتن راهکار خاصی نداره.

همون حلقه رو استفاده می‌کنم و از کوئری جدا استفاده می‌کنم.
باز هم متشکرم.
پاسخ
تشکر شده توسط: ADMIN
#7
بنده هم متقابلا از شما و آقای شهرکی سپاسگزارم. سوالتون باعث شده که برای بالا بردن سرعت و استفاده صحیح از کدها مطالعه ای دوباره داشته باشم.
پاسخ
تشکر شده توسط: ADMIN




کاربران در حال بازدید این موضوع: 1 مهمان