Если я правильно понимаю, вы хотите удалить столбец rid
из таблицы tag_rel
и вместо этого иметь в своем запросе автоматически изменяемое поле позиции.«Положение» тега в вашем случае может пониматься как количество записей в таблице tag_rel
, которые были добавлены для определенного pid
.Другими словами: все записи в таблице с одинаковыми pid
и id
равными или меньшими, при условии, что id
является полем автоинкремента.
Я думаю, что это можно сделать следующим образом.Имейте в виду, это может быть не самый эффективный код в мире:
SELECT id, pid, tid, (
SELECT count(*) from tags_rel t2 where t2.pid = t1.pid and t2.id <= t1.id
) AS rid
FROM tags_rel t1;
Я не совсем уверен, что это будет работать, поскольку у меня есть только mysql 3, который не выполняет такие подзапросы, как этот,Хотя я думаю, что так и будет.
Если у вас может быть более 4 тегов, связанных с человеком, но вы хотите использовать только первые 4 тега для каждого человека, теперь вы можете использовать:
SELECT * FROM (
[the above query]
) WHERE rid <= 4;
* 1017С учетом вышесказанного, я думаю, что почти во всех ситуациях вы могли бы просто
order by pid, id
и затем добавить ранговые числа в свой выходной носитель.Но тогда я не знаю твоего положения.
Я думаю, что самое важное: это то, что ты имел в виду?Если да, то, надеюсь, некоторые люди здесь смогут предоставить вам лучший ответ на ваш вопрос.
РЕДАКТИРОВАТЬ:
Для вашего текущего запроса это составит:
SELECT p.id as pid, t.tag as tname, tr.tid as trid, (
SELECT count(*)
FROM tags_rel AS tr2
WHERE tr2.pid = tr.pid and tr2.id <= tr.id
) AS rank
FROM tags_rel AS tr
LEFT JOIN people AS p ON tr.pid = p.id
LEFT JOIN tags AS t ON tr.tid = t.id
при условии, что вам не нужна часть where rid <= 4
.(Кстати: tr.tid as trid
подсказывает, что вы хотите выбрать tags_rel.id
вместо tags_rel.tid
(== tags.id
). Я не уверен, что вы это имеете в виду; если нет, то это может бытьлучше выбрать tr.tid as tid
(или просто tr.tid
).