Вы можете заключить <span>
в <a>
и использовать этот маленький плагин JQuery, чтобы закрасить подчеркивание. Вы можете изменить цвет, передав параметр плагину.
(function ($) {
$.fn.useful = function (params) {
var aCSS = {
'color' : '#d43',
'text-decoration' : 'underline'
};
$.extend(aCSS, params);
this.wrap('<a></a>');
var element = this.closest('a');
element.css(aCSS);
return element;
};
})(jQuery);
Затем вы звоните, написав это:
$("span.name").useful({color:'red'});
$(function () {
var spanCSS = {
'color' : '#000',
'text-decoration': 'none'
};
$.fn.useful = function (params) {
var aCSS = {
'color' : '#d43',
'text-decoration' : 'underline'
};
$.extend(aCSS, params);
this.wrap('<a></a>');
this.closest('a').css(aCSS);
};
// Use example:
$("span.name").css(spanCSS).useful({color:'red'});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<section class="container">
<div class="user important">
<span class="name">Bob</span>
-
<span class="location">Bali</span>
</div>
<div class="user">
<span class="name">Dude</span>
-
<span class="location">Los Angeles</span>
</div>
<div class="user">
<span class="name">Gérard</span>
-
<span class="location">Paris</span>
</div>
</section>
UPDATE people
SET prize = CASE WHEN id = @lucky THEN 'Gold' ELSE 'Silver' END
WHERE class = (
SELECT class
FROM people
WHERE id = @lucky
)
Это предоставит всем пользователям приз Silver
, за исключением @lucky
того, кто получит Gold
.
Если вам нужно только обновить @lucky
и экс-чемпион, напишите следующее:
UPDATE people
SET prize = CASE WHEN id = @lucky THEN 'Gold' ELSE 'Silver' END
WHERE id = @lucky
OR (class, prize) =
(
SELECT class, 'Gold'
FROM people
WHERE id = @lucky
)
Не всегда лучше выполнять сложные обновления в одном запросе SQL. Фактически, было бы более эффективно выполнить два простых запроса. Поэтому не забудьте протестировать оба решения.
MySQL поддерживает расширение синтаксиса UPDATE
для обновления нескольких таблиц. Вы можете выполнить JOIN
как часть обновления вместо использования подзапросов.
Затем вы можете использовать функцию IF ()
(или CASE
), чтобы условно измените значение приз
на другие значения.
Поэтому, если вам абсолютно необходимо использовать один запрос, попробуйте что-нибудь вроде этого:
UPDATE people p1 JOIN people p2
ON (p1.class = p2.class AND p2.id = <person_id>)
SET prize = IF(p1.id = <person_id>, 'Gold', '')
WHERE p1.id = <person_id> OR p1.prize = 'Gold';
Или эту альтернативу:
UPDATE people p1 JOIN people p2
ON (p1.class = p2.class AND p2.id = <person_id>)
SET p1.prize = CASE
WHEN p1.id = <person_id> THEN 'Gold'
WHEN p1.prize = 'Gold' THEN ''
ELSE p1.prize -- other cases are left as is
END CASE;
Если вам нужен единственный оператор, вы можете использовать оператор CASE? Не используется MySQL, но что-то вроде:
UPDATE people
SET prize = CASE
WHEN 'Gold' AND id != @newid THEN ''
WHEN '' AND id = @newid THEN 'Gold'
END
WHERE class = (
SELECT class
FROM people
WHERE id = @newid
)
Вы определенно можете создать хранимую процедуру, которая принимает в качестве аргумента идентификатор нового победителя.
Затем вы можете вызвать эту хранимую процедуру в одной строке.
Я здесь используется MS SQL, но что-то похожее на:
CREATE PROC UpdatePrize
@newid int
AS
UPDATE people
SET prize = ''
WHERE prize = 'Gold'
AND class = ( SELECT class
FROM people
WHERE id = @newid )
UPDATE people
SET prize = 'Gold'
WHERE id = @newid
GO
Поскольку вы выполняете два разных обновления, нет необходимости делать это в одном запросе. Если вы боитесь несогласованности данных, потому что один из двух запросов может дать сбой, вы можете использовать транзакции, и откат любого из двух запросов завершится неудачно.
Текущий запрос полностью читаем и понятен, в то время как опубликованные решения далеки от простых читаемый.