Simply put, I would like rid to order my pid.
Instead of creating an extra table called ‘rank’ with 4 rows I would like to be able to just attach a virtual rank that gives the same effect. My rank is just there to give a position to my tags. Since I have 4 tags per id I would have a value of 1-4 enumerating those tags.
This way I won’t have to manually put in the same numbers over and over again.
My tables:
people tags_rel tags rank
id | etc id | pid | tid | rid id | tag id
-----+----- ---+------+-----+---- ---+-------- --
2345 | 1 | 2345 | 2 | 1 1 | bread 1
2346 | 2 | 2345 | 3 | 2 2 | water 2
2347 | 3 | 2345 | 1 | 3 3 | bear 3
4 | 2345 | 6 | 4 4 | milk 4
---+------+-----+---- 5 | hotdogs
5 | 2346 | 3 | 1
6 | 2346 | 4 | 2
7 | 2346 | 2 | 3
8 | 2346 | 5 | 4
---+------+-----+----
9 | 2347 | 6 | 1
10 | 2347 | 1 | 2
11 | 2347 | 4 | 3
12 | 2347 | 5 | 4
---+------+-----+----
My query:
SELECT p.id as pid, t.tag as tname, tr.tid as trid, r.id as rank
FROM people AS p
RIGHT JOIN tags_rel AS tr ON tr.pid = p.id
LEFT JOIN tags AS t ON tr.tid = t.id
LEFT JOIN rank AS r ON tr.rid = r.id
MySQL expected results:
> +--------+------------+--------+------+ > | pid | tname | trid | rank | > +--------+------------+--------+------+ > | 2345 | water | 2 | 1 | > | 2345 | bread | 1 | 2 | > | 2345 | cereal | 3 | 3 | > | 2345 | milk | 4 | 4 | > | 2346 | cereal | 3 | 1 | > | 2346 | milk | 4 | 2 | > | 2346 | water | 2 | 3 | > | 2346 | hotdogs | 5 | 4 | > | 2347 | chocolate | 6 | 1 | > | 2347 | bread | 1 | 2 | > | 2347 | bread | 4 | 3 | > | 2347 | bread | 5 | 4 | > +--------+------------+--------+------+
I am using rank as position. So whatever tags are attached to pid I would like to show by first position. Since the tags are different for each pid they would have different positions. I may want to call tname=water by rank=1 and it would display all the ‘water’ tags in position 1 only.
Thanks!
If I understand it correctly, you want to remove the
ridcolumn from yourtag_reltable, and have an automatically genarated position field in your query instead. The “position” of a tag in your case can be understood as the number of entries in thetag_reltable that have been added for a specificpid. In other words: all entries in the table with the samepidand anidthat is equal or lower, assumingidis an autoincrement field.I think this can be done as follows. Mind you, it may not be the most efficient code in the world:
I’m not entirely sure this will work, as I only have mysql 3 here, which doesn’t do subqueries like this. I think it will though.
If you may have more than 4 tags linked to a person, but you want only the first 4 tags for each person, you can now use:
This having been said, I think in almost all situations you might as well just
order by pid, idand then adding the rank numbers in your output medium. But then, I don’t know your situation.I think the most important thing is: is this what you meant? If so, hopefully some people on here will be able to provide you with the best answer to your question.
EDIT:
For your current query, this would amount to:
assuming you don’t need the
where rid <= 4part. (By the way: thetr.tid as tridkind of suggests you want to selecttags_rel.idinstead of thetags_rel.tid(==tags.id). I’m not sure if that’s what you mean; if not, it might be better to selecttr.tid as tid(or justtr.tid).)