I am struggling to get me head round the MySQL Join function.
Here is two tables I have:
User table:
admin_id username
*1 peter93
2 stackoverflowrocks
3 user3*
Admin details table:
admin_username description image
pedro93 [text] [image_url]
stackoverflowrocks [text] [image_url]
user3 [text] [image_url]
I know usualy to link two databases together you would use ID numbers, but in this case I want to join the two tables where admin_username = username.
Can anyone help me please? It is for a PHP script if that helps.
Thanks in advance!
Peter
So that's fine. You can join on anything you like.
select *
from user
inner join admin
on user.username=admin.admin_username
joining by a string column is the same as joining by Id
select * from admin_table
inner join admin_details on admin_table.username = admin_details.admin_username
But make sure you have and index for the username columns, or else your queries will go slow when you have lots of records
You can join on pretty much any field but you may wish to keep in mind datatype mismatching, indexing etc
All users
SELECT u.*, a.*
FROM users AS u
LEFT JOIN admin AS a
ON u.username = a.username
All users that are admin
SELECT u.*, a.*
FROM users AS u
INNER JOIN admin AS a
ON u.username = a.username
All admin
SELECT u.*, a.*
FROM users AS u
RIGHT JOIN admin AS a
ON u.username = a.username
Related
I cannot correctly make the link between my 2 tables, I have a table that represents my users and another with appointments but I would like to make the link between the 2 to be able to display the appointments users.
My reservation table looks like this :
[tablebooking]
My user table looks like this :
[tableusers]
What I Tried :
[test]
If your appointment functionality is one to one relation like one appointment will have only one member then you can use below query(query followed fields from your screenshots)
SELECT
M.*, B.*
FROM
members AS M
INNER JOIN bookings AS B ON B.userid = M.userid
OR
if you want to have more than one members in one appointment, you need to have tables as below
[YOUR_USERS_TABLE_NAME] => Users list
[YOUR_BOOKINGS_TABLE_NAME] => List of appointments created
[YOUR_BOOKING_MEMBERS_TABLE_NAME] => It should have list of appointment id and members id(one(appointment) to many(users) relation)
and query will be like below
SELECT
B.*, U.*
FROM
[YOUR_BOOKINGS_TABLE_NAME] AS B
INNER JOIN [YOUR_BOOKING_MEMBERS_TABLE_NAME] AS M ON M.bookingid = B.id
INNER JOIN [YOUR_USERS_TABLE_NAME] AS U on M.userid = U.id
GROUP BY B.id, U.id
Hope my answer will help you.
Please add user_id in your bookings table and then run below query in your phpmyadmin.
select * from bookings as b INNER JOIN users as u ON u.id = b.user_id
Thanks.
You probably must use an external table to connect this tables.
EX:
foo{
id: primary,
idTableUser: external key,
idTableBooking: external key
}
I have two tables in database, named users(store user details) and posts(store post details). Now i want to get data from both tables. Like user_image from users and post description from post.
I am using this query
SELECT * FROM `users`AS u,`posts` WHERE u.user_id IN (SELECT user_id FROM `posts`)
But it returns duplicate data. I have 2 users and 3 posts but it returns 6 posts.
Try something like:
Select a.user_image, b.post_description from users as a join posts as b on a.user_id = b.user_id
Do an inner join & you shall get the desired result
In the above query a & b are alias for the two different tables. I you do not want to use alias you can also write it as users.user_image in your select statement.
Write the fields you want from both the tables in your select statements.
The below image will help you understand the inner join
Inner Join Circle for understanding
Use group by as below:
SELECT * FROM `users`AS u,`posts` WHERE u.user_id IN (SELECT user_id FROM `posts`) group by u.user_id
What about
Select * FROM user u right join posts p on u.id = p.user_id
?
if you want to get data from both tables you need to use joins.and you make sure the two tables are interlinked by primary keys
so use this can help
select user_image,post_description from users join posts on users.user_id=posts.user_id;
Hi I am trying to change some code so that users with certain group id do not show in search results.
at the moment the code is
$query = 'SELECT distinct b.'.$db->nameQuote('id')
.' FROM '.$db->nameQuote('#__users').' b';
I am trying to add something like the following but cannot get it to work.
select * from '.$db->quoteName('#__users').' where id not in (select user_id from #__user_usergroup_map where group_id = 8)
Any help would be appreciated.
Thanks.
This how you can try
select * from users u
where
not exists
(
select 1
from user_group ug
where
u.id = ug.iduser
AND ug.group_id = 8
)
You need change the table name and field name in the above query as your need.
DEMO
There are three ways of doing that.
Method 1: Join
Join usergroup_map table and then, select all rows that have different group_id that way:
SELECT <comma separated fields> from USERS u
LEFT JOIN USERGROUPS ug ON u.user_id = ug.user_id
WHERE ug.group_id != :group_id
GROUP BY u.user_id
And then -> bind any number to :group_id.
Please keep in mind that above statement will return users that are assigned to :group_id only if they are in another groups as well. (one to many relation).
Method 2: Subselect
Already suggested by other users.
Method 3: Join & Subselect
The 3rd, and the last option is to use sub-query within join statement, which tends to be the fastest solution in terms of optimalization. Of course, query times may be different depending on the engine you are working with, but it's worth giving a try.
SELECT <comma separated fields>
FROM USERS u
INNER JOIN (
SELECT g.user_id
FROM USERGROUPS g
WHERE g.group_id != :group_id
) ug ON ug.user_id = u.user_id
--
In this answer, I assume that you have properly configured database with foreign keys.
I need a little help setting up my query. I'm simply trying to access the amount of people who are in the same 'clan' by joining these two tables together, clan, users. Each users has a column 'clan' which is the same as the table clan's column 'roomOwner' and then I'm trying to get the table clan's information along with the amount of members so it would be like: room, roomOwner, members
So basically all I have is this:
SELECT c.*, count(u.clan) AS members FROM clans c inner join users u WHERE c.roomOwner = u.clan ORDER BY members;
It only shows one clan though. Any help please?
Your query has no GROUP BY clause. and I think it's only returning single record right? LEFT JOIN is needed here since there are possibilities that a clan has no member.
SELECT b.roomOwner, COUNT(a.clan) memberCount
FROM clan b
LEFT JOIN users a
ON a.clan = b.roomOwner
GROUP BY b.roomOwner
ORDER BY memberCount
You forgot GROUP BY. Do you have some "id" column in "clans" table? Group by that "id"
SELECT c.*, count(u.clan) AS members
FROM clans c
inner join users u ON c.roomOwner = u.clan
GROUP BY clans.id
And you need LEFT JOIN there instead of INNER JOIN if you want to see info about all clans, even having 0 users.
Perhaps this will help:
select c.*, count(links.id) as members
from clans c
left join users u on c.roomOwner = u,clan
group by u.clan
order by members
I have the userids of people who have joined a group in one table but not their names thatlie in another table. So I think I need to do a join. I'm starting with groupid that describes the grouop.
Table 1, groupmem has groupid and userid for the members.
Table 2, users has userid and username
The users table has every user. The groupmem only has some who have joined groups.
SQL statement should be something like following but can't get it to work.
select users.name
FROM users,groupmem
LEFT JOIN users
on groupmem.userid=users.userid
WHERE groupmem.groupid = 22
22 being some value..
Thinking maybe where clause is in wrong place or I am using wrong type of join but or not using on correctly but, in any case, can't get it to work. Thx for any suggestions:
Try:
SELECT u.username
FROM `users` u
LEFT JOIN `groupmem` g
ON u.userid = g.userid
WHERE g.groupid = 22
This should do the trick:
SELECT users.name
FROM groupmem
LEFT JOIN users ON groupmem.userid = users.userid
WHERE groupmem.groupid = 22
Your query seems to be quite right - assuming I guessed your table-structure right.