用于组合表的SQL查询(n:n)

时间:2016-06-29 14:22:47

标签: php mysql join phpmyadmin left-join

我有这些表格:

分类

  1. ID
  2. 名称
  3. KIBE_TRAEGER

    1. ID
    2. 名称
      1. ID
      2. 的region_id
      3. country_id
      4. county_code
      5. county_de
      6. REGIONS

        1. ID
        2. 国家
        3. region_de
        4. 联系人

          1. id
          2. 姓名
          3. 公司
          4. 邮政编码
          5. 城市
          6. region - > = regions.id - >应该显示regions.region_de
          7. county - > = counties.id - >应该显示counties.county_de
          8. TEL1
          9. tel2
          10. mobile
          11. 传真
          12. email1
          13. email2
          14. 主页
          15. 类别 - > = categories.id 但是在表“联系人”中写了     与; catnr; (例如,一个条目可以有多个条目:     “; 6 ;; 7 ;; 8 ;; 16;”) - >应该显示categories.name
          16. notes
          17. 活跃
          18. PERNR
          19. KIBE_CONTACTS

            1. ID
            2. openinghours
            3. 成本
            4. handicapplaces
            5. freeplaces
            6. traeger - > = kibe_traeger.id与类别相同; traegerId; (例如“; 1 ;; 5;”) - >应该显示kibe_traeger.name
            7. 我希望将它们全部合并以将其导出到csv。

              顺便说一下。到目前为止,我尝试使用左连接和内连接直接在phpmyadmin中查询我的糟糕查询,但我对SQL的东西很差,不再学习它了:P ...

              到目前为止我的代码(根据Matt Cremeen的答案编辑):

              工作:

              SELECT 
                  contacts.id, contacts.firstname, contacts.surname, contacts.company, 
                  contacts.zipcode, contacts.city, contacts.country, contacts.region,
                  contacts.county, contacts.tel1, contacts.tel2, contacts.mobile, 
                  contacts.fax, contacts.email1, contacts.email2, contacts.homepage,
                  contacts.active, contacts.pernr, kibe_contacts.id as contacts_id, 
                  kibe_contacts.openinghours, kibe_contacts.costs, kibe_contacts.groups,
                  kibe_contacts.handicapplaces, kibe_contacts.freeplaces, 
                  kibe_contacts.traeger, kibe_traeger.id as traeger_id, kibe_traeger.name,
                  counties.id as counties_id, counties.region_id as region_id, 
                  counties.country_id as country_id, counties.county_code, counties.county_de,
                  regions.id as regions_id, regions.country as regions_country, regions.region_de
              FROM
                  contacts
              INNER JOIN
                  kibe_contacts ON contacts.id = kibe_contacts.contact_id
              INNER JOIN
                  regions ON contacts.region = regions.id
              INNER JOIN
                  counties ON contacts.county = counties.id
              

              正在工作:

              INNER JOIN
                  kibe_traeger ON kibe_contacts.traeger = kibe_traeger.id
              INNER JOIN
                  categories ON contacts.categories = categories.id;
              

              我收到了“Null-Result”我想我知道为什么会收到此错误:因为在kibe_contacts.traeger列和contacts.categories列中有多个值与{{{{1}分隔1}}例如一个条目可以有多个条目:;但在categories.id中只有一个ID,例如4。

              是否有任何解决方案可以查询出来?

              上次修改:解决了我自己的第二个问题:我导出了这个列表并使用搜索&取代

              再次感谢所有帮助者!

2 个答案:

答案 0 :(得分:1)

尝试使用MySQL的GROUP_CONCAT功能。这是我的示例SQL

我有两张桌子,clientes ('Id' int, 'nome' varchar(50) )

clientes
1 Rafael
2 Jony
3 Smith

clientes_devices ('Id' int, 'id_cliente' int, 'device' varchar(50) )

clientes_devices 
1 1 AsusZenFone
2 1 MotorolaG
3 2 WindowsPhone

这是选择命令

select c.nome, GROUP_CONCAT(DISTINCT d.device SEPARATOR ',') AS Device
from clientes c
join clientes_dispositivos d on (c.id = d.id_cliente)
where c.id = 1

这是输出

SQL Output with the Group_Concat function
没有这个功能,我得到了这个

Without the function, I got this

答案 1 :(得分:1)

假设id字段对应于每个表,您将要加入该字段上的每个表。我不会在这里写下所有代码,但它会像这样开始

SELECT contacts.id, contacts.firstname, contacts.surname, ...
FROM contacts
INNER JOIN
kibe_contacts
ON contacts.id = kibe_contacts.id
INNER JOIN
regions
on contacts.region_id = regions.id
...