I don't have time today to answer your question in detail but the basic
technique you need to use is an _OUTER_ join. Those should be completely
compatible for version 4 and above of MySQL.
A regular join, which is usually called an "inner" or "natural" join,
combines rows of tables where the corresponding keys have equal _NON-NULL_
keys. (A 'null' is a special value that means "unknown" or "not
applicable"). An outer join does the same work as an inner join but also
picks up rows whose keys don't match any of the rows in the other table.
There are three types of outer joins:
- right outer join
- left outer join
- full outer join
[The last time I looked, MySQL didn't directly support the full outer join
but that was a couple of years ago; it may be supported in version 4.1 and
above. Check the manual for yourself to see.]
The "right" and "left" in "right outer join" and "left outer join" refer to
the tables that are on the right and left hand sides of the query. For
select name, address, salary
from foo f inner join bar b on f.id = b.idno
"foo" is the left hand table in the join and "bar" is the right hand table
in the join; "foo" appears to the left of "bar" in the FROM clause.
A right outer join does an inner join between the two tables in the join and
then picks up the "orphans" (unmatched rows) from the right hand table.
A left outer join does an inner join between the two tables in the join and
then picks up the orphans from the left hand table.
A full outer join does an inner join between the two tables in the join and
then picks up the orphans from _both_ tables.
I'm sure you can find some tutorials with examples of how to write various
outer joins if you Google on "SQL tutorial". The MySQL manual didn't have
much on joins beyond the statement syntax the last time I looked - many
months ago - but MySQL uses standard SQL so _any_ SQL tutorial should have
some good examples for you, even if it is intended for DB2 or Oracle users.
When you understand the concepts and syntax, you should be able to apply
this information to your specific problem.
----- Original Message -----
From: "bruno b b magalhães" <brunobbm@stripped>
To: "MySQL List" <mysql@stripped>
Sent: Saturday, November 19, 2005 9:51 AM
Subject: BIIIIIIIIIIG query
> Hi guys,
> I need some help with an query that I know I must use joins, but I can't
> figure out how to.
> The problem is, when the contact has an address, phone and email it works
> just fine, but I want it to display those how doesnt also! Could someone
> with JOINs experience help me?
> And one more question, how compatible are joins? I mean, the environment
> I am developing in is MySQL 4.1, but some of my clients are using 4.0.25
> and others are using 5.0.
> The query is this:
> SELECT SQL_CACHE
> /* CONTACTS FIELDS */
> contacts.contact_id AS id,
> contacts.contact_code AS code,
> contacts.contact_name AS name,
> contacts.contact_tax_id AS tax_id,
> contacts.contact_birth AS birth,
> <RIGHT(contacts.contact_birth,5)) AS age,
> contacts.contact_timezone AS timezone,
> /* CONTACTS RELATED FIELDS */
> contact_entities.contact_entity_name AS entity_name,
> contact_genders.contact_gender_name AS gender_name,
> contact_types.contact_type_name AS type_name,
> contact_types.contact_type_level AS type_level,
> contact_statuses.contact_status_name AS status_name
> /* CONTACTS TABLES */
> flx_contacts AS contacts,
> flx_contacts_to_contacts AS contacts_to_contacts,
> /* CONTACTS RELATED TABLES */
> flx_contact_entities AS contact_entities,
> flx_contact_genders AS contact_genders,
> flx_contact_types AS contact_types,
> flx_contact_statuses AS contact_statuses,
> /* ADDRESSES TABLES */
> flx_contacts_addresses AS addresses,
> flx_'contacts_address_types AS address_types,
> flx_contacts_to_addresses AS contacts_to_addresses,
> /* PHONES TABLES */
> flx_contacts_phones AS phones,
> flx_contacts_phone_types AS phone_types,
> 'flx_contacts_to_phones AS contacts_to_phones,
> /* EMAILS TABLES */
> flx_contacts_emails AS emails,
> flx_contacts_email_types AS email_types,
> flx_'contacts_to_emails AS contacts_to_emails
> /* JOINING CONTACTS RELATED TABLES */
> contacts.contact_id = contacts_to_contacts.contact_child_id
> contacts.contact_entity_id = contact_entities.contact_entity_id
> contacts.contact_gender_id = contact_genders.contact_gender_id
> contacts.contact_type_id = contact_types.contact_type_id
> contacts.contact_status_id = contact_statuses.contact_status_id
> contacts_to_contacts.contact_parent_id = 0
> /* JOINING ADDRESSES TABLES */
> addresses.address_id = contacts_to_addresses.address_id
> contacts_to_addresses.contact_id = contacts.contact_id
> contacts_to_addresses.address_type_id = address_types.address_type_id
> /* JOINING PHONES TABLES */
> phones.phone_id = contacts_to_phones.phone_id
> contacts_to_phones.contact_id = contacts.contact_id
> contacts_to_phones.phone_type_id = phone_types.phone_type_id
> /* JOINING EMAILS TABLES */
> emails.email_id = contacts_to_emails.email_id
> contacts_to_emails.contact_id = contacts.contact_id
> contacts_to_emails.email_type_id = email_types.email_type_id
> /* SEARCHING */
> MATCH (contacts.contact_code, contacts.contact_name,
> contacts.contact_tax_id) AGAINST ('KEYWORD' IN BOOLEAN MODE)
> MATCH (addresses.address_line_one, addresses.address_line_two,
> addresses.address_line_three, addresses.address_zipcode,
> addresses.address_neighborhood, addresses.address_city,
> addresses.address_state, addresses.address_country) AGAINST ('KEYWORD' IN
> BOOLEAN MODE)
> MATCH (phones.phone_countrycode, phones.phone_areacode,
> phones.phone_number) AGAINST ('KEYWORD' IN BOOLEAN MODE)
> MATCH (emails.email_address) AGAINST ('KEYWORD' IN BOOLEAN MODE)
> GROUP BY
> ORDER BY
> Many thanks in advance!
> Best Regards,
> Bruno B B Magalhaes
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe: http://lists.mysql.com/mysql?unsub=1
> No virus found in this incoming message.
> Checked by AVG Free Edition.
> Version: 7.1.362 / Virus Database: 267.13.4/175 - Release Date: 18/11/2005
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.362 / Virus Database: 267.13.4/175 - Release Date: 18/11/2005