mysql - подзапросы и соединения

Оптимистическая блокировка используется, когда Вы не ожидаете много коллизий. Это стоит меньше, чтобы сделать нормальное функционирование, но если бы коллизия ДЕЙСТВИТЕЛЬНО происходит, Вы заплатили бы более высокую цену для разрешения его, поскольку транзакция прерывается.

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

Для выбора надлежащего механизма блокировки необходимо оценить объем чтений и записей и плана соответственно.

5
задан Andomar 28 June 2009 в 18:54
поделиться

2 ответа

Вы можете получить случайное изображение в подзапросе:

select 
    g.name, u.username,
    (select url from pictures p where p.gallery_id = g.gallery_id 
     order by rand() limit 1) as url
from galleries g
left join users u on g.user_id = u.id
where g.active = 1

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

select 
    g.name, u.username, p.url, p.name
from (
    select id, user_id, name,
        (select id from pictures p 
         where p.gallery_id = g.gallery_id 
         order by rand() limit 1) as samplepictureid
    from galleries
    where g.active = 1
) g
left join users u on g.user_id = u.id
left join pictures p on p.id = g.samplepictureid
2
ответ дан 15 December 2019 в 06:33
поделиться
SELECT
    g.id,
    g.name,
    u.username,
    p.url
FROM
    galleries g
    INNER JOIN (SELECT DISTINCT
         gallery_id,
         (SELECT url FROM pictures ss WHERE ss.gallery_id = s.gallery_id 
             ORDER BY RAND() LIMIT 1) AS url
     FROM
         pictures s) p ON
        g.id = p.gallery_id
    LEFT OUTER JOIN users u ON
        g.user_id = u.id
WHERE
    g.active = 1

Этот запрос выйдет и выберет галерею, затем он найдет любую галерею с изображением (если вы хотите вернуть галереи без изображения, измените INNER JOIN на LEFT OUTER JOIN, и все будет в порядке). После этого он объединяется с пользователями. Теперь, конечно же, этот щенок вернет каждую чертову галерею для любого количества пользователей (ура!). Вы можете захотеть ограничить пользователя в предложении WHERE (например, - WHERE u.id = 123 ). В противном случае вы получите больше результатов, чем ожидаете. Это или сделайте на нем ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

1
ответ дан 15 December 2019 в 06:33
поделиться
Другие вопросы по тегам:

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