Try using an UPDATE JOIN of the table against itself
UPDATE
animal_table A
INNER JOIN
(
SELECT
category_id,summary_id,
animal_nbr,animal_amount,'00' info3
FROM animal_table
WHERE animal_type = 'special'
) B USING (category_id,summary_id)
SET
A.animal_info1 = B.animal_nbr,
A.animal_info2 = B.animal_amount,
A.animal_info3 = B.info3
WHERE
A.animal_type = 'cats' AND
A.category_id = 'foo';
Make sure that animal_table has a compound index on category_id and summary_id. If you do not have such an index, please run this:
ALTER TABLE animal_table ADD INDEX (category_id,summary_id);
UPDATE 2011-09-27 13:10 EDT
I just noticed that categrory_id 'foo' limits the dataset. Here is an updated refactoring of my answer ( I moved category_id = foo into the subquery )
UPDATE
animal_table A
INNER JOIN
(
SELECT
category_id,summary_id,
animal_nbr,animal_amount,'00' info3
FROM animal_table
WHERE animal_type = 'special'
AND category_id = 'foo'
) B USING (category_id,summary_id)
SET
A.animal_info1 = B.animal_nbr,
A.animal_info2 = B.animal_amount,
A.animal_info3 = B.info3
WHERE
A.animal_type = 'cats';
I also recommend adding this additional index to accommodate the subquery
ALTER TABLE animal_table ADD INDEX (animal_type,category_id);
SELECT
u1.id,
u1.domain,
t1.end_date
FROM urls u1
INNER JOIN
(SELECT
l1.urls_id,
MIN(end_date) as end_date
FROM urls u2
INNER JOIN links l1
ON u2.id = l1.urls_id
AND l1.status = "Approved"
AND (l1.end_date > now() OR l1.end_date IS NOT NULL)
GROUP BY l1.urls_id) t1
ON u1.id = t1.urls_id
Source requirements (not 100% sure about p4, so this could be changed):
1). end_date NOT NULL AND
2). end_date > now()
3). status is "Approved" AND
4). return latest end_date closer to present or now.
Best Answer
This query is generated from midnightcowboycoder.com. Don't forget to replace backtick with a single quote.