PDA

View Full Version : سوال: ایجاد شرط برای SQL_CALC_FOUND_ROWS



afsharjowkar
چهارشنبه 29 خرداد 1392, 12:48 عصر
سلام یه کوئری دارم به صورت زیر :

SELECT SQL_CALC_FOUND_ROWS tag, COUNT( tag ) AS count
FROM _tags
GROUP BY tag
ORDER BY count DESC
LIMIT 100


این کوئری تعداد تگها رو بر میگردونه میخوام بگم اونایی که تعداد تگهاش 1 هست روپاک کنه چجور میتونم روی count شرط بزارم؟

امیـرحسین
چهارشنبه 29 خرداد 1392, 19:37 عصر
برای SELECTمیتونید از HAVING استفاده کنید. HAVING در واقع یه WHERE رو نتیجه‌ی کوئریه:
SELECT SQL_CALC_FOUND_ROWS tag, COUNT( tag ) AS count
FROM _tags
GROUP BY tag
HAVING count = 1
ORDER BY count DESC
LIMIT 100;

afsharjowkar
چهارشنبه 29 خرداد 1392, 20:06 عصر
برای SELECTمیتونید از HAVING استفاده کنید. HAVING در واقع یه WHERE رو نتیجه‌ی کوئریه:
SELECT SQL_CALC_FOUND_ROWS tag, COUNT( tag ) AS count
FROM _tags
GROUP BY tag
HAVING count = 1
ORDER BY count DESC
LIMIT 100;

ممنون از پاسختون كار ميكنه به درستي فقط يه سوال
الان ميخوام همين شرطو براي پاك كردن بزارم ولي كار نميكنه Delete روش ديگه اي داره ؟

امیـرحسین
پنج شنبه 30 خرداد 1392, 10:24 صبح
DELETE FROM _tags
WHERE id IN (
SELECT id, COUNT(tag) AS count
FROM _tags
GROUP BY tag
HAVING count = 1
ORDER BY count DESC
LIMIT 100
);

afsharjowkar
پنج شنبه 30 خرداد 1392, 10:57 صبح
DELETE FROM _tags
WHERE id IN (
SELECT id, COUNT(tag) AS count
FROM _tags
GROUP BY tag
HAVING count = 1
ORDER BY count DESC
LIMIT 100
);

اين خطا رو ميده

#1241 - Operand should contain 1 column(s)

سعید صابری
پنج شنبه 30 خرداد 1392, 13:45 عصر
چون شما در قسمت شرط where id in فقط یک فیلد معرفی کرده اید ولی در قسمت مقایسه id, COUNT(tag) AS count دو فیلد وجود دارد طبیعی است که مقدار یک فیلد را نمی توان با دو فیلد همزمان مقایسه نمود

امیـرحسین
پنج شنبه 30 خرداد 1392, 14:04 عصر
دستور COUNT رو میتونی توی HAVING بذاری و اون فیلد رو حذف کنی اگه ORDER BY اینا رو نمیخوای. در غیر اینصورت اینو تست کن
DELETE FROM _tags
WHERE id IN (
SELECT id FROM (
SELECT id, COUNT(tag) AS count
FROM _tags
GROUP BY tag
HAVING count = 1
ORDER BY count DESC
LIMIT 100
)
);

امیـرحسین
پنج شنبه 30 خرداد 1392, 14:07 عصر
اگه ارور alias گرفتی برای SELECT تویی alias بذار:
DELETE FROM _tags
WHERE id IN (
SELECT id FROM (
SELECT id, COUNT(tag) AS count
FROM _tags
GROUP BY tag
HAVING count = 1
ORDER BY count DESC
LIMIT 100
) AS a
);

afsharjowkar
پنج شنبه 30 خرداد 1392, 14:12 عصر
اين كوئري رو زدم جواب داد

DELETE dle_tags.* FROM dle_tags
JOIN (
SELECT tag FROM dle_tags GROUP BY tag HAVING COUNT(tag) = 1
) AS subq USING (tag)