За последние 24 часа нас посетили 54120 программистов и 1719 роботов. Сейчас ищут 859 программистов ...

как реализовать? один ко многим

Тема в разделе "MySQL", создана пользователем Lesya, 3 сен 2009.

  1. Lesya

    Lesya Активный пользователь

    С нами с:
    14 авг 2006
    Сообщения:
    54
    Симпатии:
    0
    Адрес:
    Запорожье
    В базе есть таблицы:
    tabl1: doc_ID, document, text
    tabl2: record_ID, doc_id
    одной записи в tabl1 соответствует несколько записей из tabl2
    Надо вывести данные в виде:
    Код (Text):
    1. +---------+-----------+-------+------------------------------------------+
    2. | doc_ID1 | document1 | text1 | record_ID1_1, record_ID1_2, record_ID1_3 |
    3. +---------+-----------+-------+------------------------------------------+
    4. | doc_ID2 | document2 | text2 | record_ID2_1, record_ID2_2
    5. +---------+-----------+-------+------------------------------------------+
    6. | doc_ID3 | document3 | text3 | record_ID3_1
    7. +---------+-----------+-------+------------------------------------------+
    8. | doc_ID4 | document4 | text4 | record_ID4_1, record_ID4_2, record_ID4_3 |
    9. +---------+-----------+-------+------------------------------------------+
    Написала такой запрос:
    [sql]SELECT
    tbl1.doc_ID,
    tbl1.document,
    tbl1.text,
    tbl2.record_ID
    FROM tbl1, tbl2
    WHERE
    tbl2.doc_id = tbl1.doc_ID[/sql]

    Но он выдает результат в виде:
    Код (Text):
    1. +---------+-----------+-------+--------------+
    2. | doc_ID1 | document1 | text1 | record_ID1_1 |
    3. +---------+-----------+-------+--------------+
    4. | doc_ID1 | document1 | text1 | record_ID1_2 |
    5. +---------+-----------+-------+--------------+
    6. | doc_ID1 | document1 | text1 | record_ID1_3 |
    7. +---------+-----------+-------+--------------+
    8. | doc_ID2 | document2 | text2 | record_ID2_1 |
    9. +---------+-----------+-------+--------------+
    10. | doc_ID2 | document2 | text2 | record_ID2_2 |
    11. +---------+-----------+-------+--------------+
    12. | doc_ID3 | document3 | text3 | record_ID3_1 |
    13. +---------+-----------+-------+--------------+
    14. | doc_ID4 | document4 | text4 | record_ID4_1 |
    15. +---------+-----------+-------+--------------+
    16. | doc_ID4 | document4 | text4 | record_ID4_2 |
    17. +---------+-----------+-------+--------------+
    18. | doc_ID4 | document4 | text4 | record_ID4_3 |
    19. +---------+-----------+-------+--------------+
    GROUP BY tbl1.doc_ID не помогает, теряются record_ID все кроме первой.

    Варианты решения:
    1) проанализировать средствами РНР ту информацию, что имеем (сравнение строк и если doc_ID совпадает - группировать record_ID)
    2) Можно ли как-то получить такой вариант:
    Код (Text):
    1. doc_ID1     document1     text1     кол-во_records1     record_ID1_1     record_ID1_2     record_ID1_3
    2. doc_ID2     document2     text2     кол-во_records2     record_ID2_1     record_ID2_2     NULL
    3. doc_ID3     document3     text3     кол-во_records3     record_ID3_1     NULL             NULL
    4. doc_ID4     document4     text4     кол-во_records4     record_ID4_1     record_ID4_2     record_ID4_3
    Тут первые четыре столбца не проблема, а вот как добавить список record_ID в конце :?:
    3) возможно я вообще не в том направлении двигаюсь
     
  2. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
  3. Lesya

    Lesya Активный пользователь

    С нами с:
    14 авг 2006
    Сообщения:
    54
    Симпатии:
    0
    Адрес:
    Запорожье
    ооо, хорошая функция, спасибо!
    А так: GROUP_CONCAT(SELECT ...) она не работает?

    :( плоха
    группирует она ID, а я их еще в стринг должна как-то перевести
     
  4. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Эта функция работает с пересечениями после группировки.
     
  5. Lesya

    Lesya Активный пользователь

    С нами с:
    14 авг 2006
    Сообщения:
    54
    Симпатии:
    0
    Адрес:
    Запорожье
    Эта строка работает:
    [sql]SELECT doc_id, GROUP_CONCAT(adres_id) FROM tbl_doc_adr GROUP BY doc_id;[/sql]

    Хотелось бы чтобы работала и эта:
    [sql]SELECT doc_id, GROUP_CONCAT(SELECT adresname FROM tbl_adresa WHERE tbl_adresa.adresID=tbl_doc_adr.adres_id) FROM tbl_doc_adr GROUP BY doc_id;[/sql]
     
  6. kostyl

    kostyl Guest

    Lesya
    Всем всегда хочется чего то несбывающегося.
     
  7. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    А этот вариант чем не подходит:
    [sql]SELECT doc_id, GROUP_CONCAT(adresname) FROM tbl_doc_adr, tbl_adresa WHERE tbl_adresa.adresID=tbl_doc_adr.adres_id GROUP BY doc_id;[/sql]
     
  8. Lesya

    Lesya Активный пользователь

    С нами с:
    14 авг 2006
    Сообщения:
    54
    Симпатии:
    0
    Адрес:
    Запорожье
    AlexGousev
    Тем, что мне он в голову, забитой кашей, не пришел :)
    Спасибо :) теперь все работает как надо.