mysql вложенный ВЫБОР в ОБНОВЛЕНИИ той же таблицы

Вы можете заключить <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>
11
задан adam 27 May 2009 в 18:53
поделиться

5 ответов

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
       )
7
ответ дан 3 December 2019 в 06:47
поделиться

Не всегда лучше выполнять сложные обновления в одном запросе 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;
10
ответ дан 3 December 2019 в 06:47
поделиться

Если вам нужен единственный оператор, вы можете использовать оператор 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 
              )
1
ответ дан 3 December 2019 в 06:47
поделиться

Вы определенно можете создать хранимую процедуру, которая принимает в качестве аргумента идентификатор нового победителя.

Затем вы можете вызвать эту хранимую процедуру в одной строке.

Я здесь используется 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
0
ответ дан 3 December 2019 в 06:47
поделиться

Поскольку вы выполняете два разных обновления, нет необходимости делать это в одном запросе. Если вы боитесь несогласованности данных, потому что один из двух запросов может дать сбой, вы можете использовать транзакции, и откат любого из двух запросов завершится неудачно.

Текущий запрос полностью читаем и понятен, в то время как опубликованные решения далеки от простых читаемый.

0
ответ дан 3 December 2019 в 06:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: