Нужна помощь с PHP и MySQL

У меня есть таблица песен, некоторые песни - альбомные, а некоторые - синглы... И у меня есть таблица альбомов...

Пример:

если идентификатор альбома [null], это означает, что песня является синглом

Таблица песен:

+--------+---------+-----------+----------------+---------+---------------+-------+--------+--------+------+-------+-------+----------+
| Row ID | Song ID | Album ID  |    Song Name   |   Band  | Date Released | Genre | Lyrics | Lenght | Size | Plays | Likes | Dislikes |
+--------+---------+-----------+----------------+---------+---------------+-------+--------+--------+------+-------+-------+----------+
|    1   | Song-01 |  Album-1  |    Song-001    | Band-1  |  2010-12-15   | Rock  |   ...  |  4:30  | 4 MB |  101  |  11   |    1     |
|    2   | Song-02 |  Album-1  |    Song-002    | Band-1  |  2010-12-15   | Rock  |   ...  |  5:30  | 5 MB |  102  |  12   |    2     |
|    3   | Song-03 |  Album-1  |    Song-003    | Band-1  |  2010-12-15   | Rock  |   ...  |  3:30  | 3 MB |  103  |  13   |    3     |
|    4   | Song-04 |   [null]  |    Song-004    | Band-1  |  2010-12-16   | Rock  |   ...  |  4:30  | 4 MB |  104  |  14   |    4     |
|    5   | Song-05 |  Album-2  |    Song-005    | Band-1  |  2010-12-17   | POP   |   ...  |  3:30  | 3 MB |  105  |  15   |    5     |
|    6   | Song-06 |  Album-2  |    Song-006    | Band-1  |  2010-12-17   | RAP   |   ...  |  5:30  | 5 MB |  106  |  16   |    6     |
|    7   | Song-07 |   [null]  |    Song-007    | Band-2  |  2010-12-17   | Rock  |   ...  |  3:30  | 3 MB |  107  |  17   |    7     |
|    8   | Song-08 |  Album-3  |    Song-008    | Band-2  |  2010-12-17   | Rock  |   ...  |  4:30  | 4 MB |  108  |  18   |    8     |
|    9   | Song-09 |  Album-3  |    Song-009    | Band-2  |  2010-12-17   | POP   |   ...  |  5:30  | 5 MB |  109  |  19   |    9     |
|   10   | Song-10 |  Album-3  |    Song-010    | Band-2  |  2010-12-17   | Punk  |   ...  |  6:30  | 6 MB |  110  |  20   |    0     |
|   11   | Song-11 |  Album-3  |    Song-011    | Band-2  |  2010-12-17   | RAP   |   ...  |  7:30  | 7 MB |  111  |  21   |    1     |
|   12   | Song-12 |   [null]  |    Song-012    | Band-2  |  2010-12-18   | Rock  |   ...  |  3:30  | 3 MB |  112  |  22   |    2     |
|   13   | Song-13 |   [null]  |    Song-013    | Band-2  |  2010-12-18   | Rock  |   ...  |  2:30  | 2 MB |  113  |  23   |    3     |
|   14   | Song-14 |   [null]  |    Song-014    | Band-3  |  2010-12-18   | Rock  |   ...  |  6:30  | 6 MB |  114  |  24   |    4     |
|   15   | Song-15 |   [null]  |    Song-015    | Band-3  |  2010-12-19   | Rock  |   ...  |  7:30  | 7 MB |  115  |  25   |    5     |
|   16   | Song-16 |   [null]  |    Song-016    | Band-3  |  2010-12-19   | Rock  |   ...  |  4:30  | 4 MB |  116  |  26   |    6     |
|   17   | Song-17 |   [null]  |    Song-017    | Band-4  |  2010-12-19   | POP   |   ...  |  3:30  | 3 MB |  117  |  27   |    7     |
|   18   | Song-18 |   [null]  |    Song-018    | Band-4  |  2010-12-19   | POP   |   ...  |  2:30  | 2 MB |  118  |  28   |    8     |
|   19   | Song-19 |   [null]  |    Song-019    | Band-5  |  2010-12-20   | Rock  |   ...  |  4:30  | 4 MB |  119  |  29   |    9     |
|   20   | Song-20 |   [null]  |    Song-020    | Band-5  |  2010-12-20   | Rock  |   ...  |  5:30  | 5 MB |  120  |  30   |    0     |
|   21   | Song-21 |   [null]  |    Song-021    | Band-5  |  2010-12-20   | Rock  |   ...  |  6:30  | 6 MB |  121  |  31   |    1     |
|   22   | Song-22 |  Album-4  |    Song-022    | Band-5  |  2010-12-21   | Rock  |   ...  |  3:30  | 3 MB |  122  |  32   |    2     |
|   23   | Song-23 |  Album-4  |    Song-023    | Band-5  |  2010-12-21   | Rock  |   ...  |  2:30  | 2 MB |  123  |  33   |    3     |
|   24   | Song-24 |  Album-4  |    Song-024    | Band-5  |  2010-12-21   | Rock  |   ...  |  4:30  | 4 MB |  124  |  34   |    4     |
|   25   | Song-25 |   [null]  |    Song-025    | Band-6  |  2010-12-22   | Rock  |   ...  |  5:30  | 5 MB |  125  |  35   |    5     |
|   26   | Song-26 |   [null]  |    Song-026    | Band-6  |  2010-12-22   | Rock  |   ...  |  6:30  | 6 MB |  126  |  36   |    6     |
|   27   | Song-27 |  Album-5  |    Song-027    | Band-7  |  2010-12-22   | POP   |   ...  |  4:30  | 4 MB |  127  |  37   |    7     |
|   28   | Song-28 |  Album-5  |    Song-028    | Band-7  |  2010-12-22   | PUNK  |   ...  |  3:30  | 3 MB |  128  |  38   |    8     |
|   29   | Song-29 |   [null]  |    Song-029    | Band-7  |  2010-12-23   | Rock  |   ...  |  2:30  | 2 MB |  129  |  39   |    9     |
|   30   | Song-30 |  Album-6  |    Song-030    | Band-8  |  2010-12-25   | Rock  |   ...  |  5:30  | 5 MB |  130  |  40   |    0     |
+--------+---------+-----------+----------------+---------+---------------+-------+--------+--------+------+-------+-------+----------+

Таблица альбомов:

+--------+-----------+----------------+---------+---------------+-------------------+--------+-------+----------+
| Row ID | Album ID  |    Album Name  |   Band  | Date Released |       Genre       | Lenght | Likes | Dislikes |
+--------+-----------+----------------+---------+---------------+-------------------+--------+-------+----------+
|    1   |  Album-1  |    Album One   | Band-1  |  2010-12-15   |       Rock        | 13:30  |  101  |    31    |
|    2   |  Album-2  |    Album Two   | Band-1  |  2010-12-17   |      POP/RAP      |  9:00  |  102  |    32    |
|    3   |  Album-3  |   Album Three  | Band-2  |  2010-12-17   | Rock/Punk/POP/RAP | 24:00  |  103  |    33    |
|    4   |  Album-4  |    Album Four  | Band-5  |  2010-12-21   |       Rock        | 10:30  |  104  |    34    |
|    5   |  Album-5  |    Album Five  | Band-7  |  2010-12-22   |      Punk/POP     |  8:00  |  105  |    35    |
|    6   |  Album-6  |    Album Six   | Band-8  |  2010-12-25   |       Rock        |  5:30  |  106  |    36    |
+--------+-----------+----------------+---------+---------------+-------------------+--------+-------+----------+

И если я хочу взять только последние пять альбомов и/или синглов, это означает, что результат будет (в порядке от последнего к самому старому):

под столбцом «имя» я имею в виду «Одно имя или название альбома»

Страница 1:

+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+
|       Name      |   Band  |  Date Released  |       Genre       | IsAlbum? | IsSingle? | Lyrics | Lenght | Size | Likes | Dislikes | Plays |
+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+
|  Album Six      | Band-8  |    2010-12-25   |       Rock        |   YES    |     NO    |    -   |  5:30  |  --  |  106  |    36    |   -   |
|  Song 29        | Band-7  |    2010-12-23   |       Rock        |    NO    |    YES    |   ...  |  2:30  | 2 MB |   39  |     9    |  129  |
|  Album Five     | Band-7  |    2010-12-22   |      Punk/POP     |   YES    |     NO    |    -   |  8:00  |  --  |  105  |    35    |   -   |
|  Song 26        | Band-6  |    2010-12-22   |       Rock        |    NO    |    YES    |   ...  |  6:30  | 6 MB |   36  |     6    |  126  |
|  song 25        | Band-6  |    2010-12-22   |       Rock        |    NO    |    YES    |   ...  |  5:30  | 5 MB |   35  |     5    |  125  |
+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+

И если я хочу взять только последние пять после последних пяти (те, что в таблице выше) альбомов и/или синглов, результат будет упорядочен от самого последнего до самого старого):

Страница 2:

+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+
|       Name      |   Band  |  Date Released  |       Genre       | IsAlbum? | IsSingle? | Lyrics | Lenght | Size | Likes | Dislikes | Plays |
+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+
|  Album Four     | Band-5  |    2010-12-21   |       Rock        |   YES    |     NO    |    -   | 10:30  |  --  |  104  |    34    |   -   |
|  Song 21        | Band-5  |    2010-12-20   |       Rock        |    NO    |    YES    |   ...  |  6:30  | 6 MB |   31  |     1    |  121  |
|  Song 20        | Band-5  |    2010-12-20   |       Rock        |    NO    |    YES    |   ...  |  5:30  | 5 MB |   30  |     0    |  120  |
|  Song 19        | Band-5  |    2010-12-20   |       Rock        |    NO    |    YES    |   ...  |  4:30  | 4 MB |   29  |     9    |  119  |
|  song 18        | Band-4  |    2010-12-19   |        POP        |    NO    |    YES    |   ...  |  2:30  | 2 MB |   28  |     8    |  118  |
+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+

И пять перед ними будут:

Страница 3:

+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+
|       Name      |   Band  |  Date Released  |       Genre       | IsAlbum? | IsSingle? | Lyrics | Lenght | Size | Likes | Dislikes | Plays |
+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+
|  Song 17        | Band-4  |    2010-12-19   |        POP        |    NO    |    YES    |   ...  |  3:30  | 3 MB |   27  |     7    |  117  |
|  Song 16        | Band-3  |    2010-12-19   |       Rock        |    NO    |    YES    |   ...  |  4:30  | 4 MB |   26  |     6    |  116  |
|  Song 15        | Band-3  |    2010-12-19   |       Rock        |    NO    |    YES    |   ...  |  5:30  | 5 MB |   25  |     5    |  115  |
|  Song 14        | Band-3  |    2010-12-18   |       Rock        |    NO    |    YES    |   ...  |  6:30  | 6 MB |   24  |     4    |  114  |
|  song 13        | Band-2  |    2010-12-18   |       Rock        |    NO    |    YES    |   ...  |  2:30  | 2 MB |   23  |     3    |  113  |
+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+

И пять до:

Страница 4:

+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+
|       Name      |   Band  |  Date Released  |       Genre       | IsAlbum? | IsSingle? | Lyrics | Lenght | Size | Likes | Dislikes | Plays |
+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+
|  Song 12        | Band-2  |    2010-12-18   |       Rock        |    NO    |    YES    |   ...  |  3:30  | 3 MB |   22  |     2    |  112  |
|  Album Three    | Band-2  |    2010-12-17   | Rock/Punk/POP/RAP |   YES    |     NO    |    -   | 24:00  |  --  |  103  |    33    |   -   |
|  Song 7         | Band-2  |    2010-12-17   |       Rock        |    NO    |    YES    |   ...  |  3:30  | 3 MB |   17  |     7    |  107  |
|  Album Two      | Band-1  |    2010-12-17   |      POP/RAP      |   YES    |     NO    |    -   |  9:00  |  --  |  102  |    32    |   -   |
|  song 4         | Band-1  |    2010-12-16   |       Rock        |    NO    |    YES    |   ...  |  4:30  | 4 MB |   14  |     4    |  104  |
+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+

И в последней таблице (или странице):

Страница 5:

+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+
|       Name      |   Band  |  Date Released  |       Genre       | IsAlbum? | IsSingle? | Lyrics | Lenght | Size | Likes | Dislikes | Plays |
+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+
|  Album One      | Band-1  |    2010-12-15   |       Rock        |   YES    |     NO    |    -   | 13:00  |  --  |  101  |    31    |   -   |
+-----------------+---------+-----------------+-------------------+----------+-----------+--------+--------+------+-------+----------+-------+

Но проблема в том, что когда я это делаю, X и Y в «LIMIT X, Y» не будут X=0,Y=5 или X=5,Y=5 или X=10,Y=5 и скоро...

Итак, мой вопрос: как я могу сделать то, что я сделал выше, в PHP и SQL (MySQL)?


Извините за мой английский и заранее спасибо


person Andy    schedule 05.04.2011    source источник
comment
X=5, Y=10 верно? Это опечатка?   -  person Shoe    schedule 06.04.2011
comment
Я не уверен, что вы могли бы сделать это более запутанным, если бы попытались. покажи свой SQL.   -  person JNK    schedule 06.04.2011
comment
Опубликуйте запрос, который вы в настоящее время используете для загрузки альбомов и синглов. Только тогда мы сможем помочь вам с вашей пейджинговой проблемой.   -  person Kevin Peno    schedule 06.04.2011
comment
+1 за то, что нашли время спланировать/отобразить этот вопрос...   -  person Lawrence Cherone    schedule 06.04.2011
comment
Чарльепига & JNK & Кевин Пено: Да, это опечатка, код, который я написал для этого, не работает так, как я хочу, поэтому я удалил его... JNK: Я постараюсь отредактировать описание, чтобы сделать его менее запутанным... Но если вы посмотрите на приведенный мной пример результата (все они), вы поймете, что моя проблема... Лоуренс Чероне: ххх :p   -  person Andy    schedule 06.04.2011


Ответы (2)


Вы неправильно понимаете предложения LIMIT. это OFFSET,QUANTITY. Ваши примеры запросов извлекают 5 записей за раз, поэтому КОЛИЧЕСТВО всегда будет равно 5, и вы будете увеличивать смещение на 5 для каждой «страницы» результатов.

Top 5 songs/albums: LIMIT 0,5
Top 6-10 songs/album: LIMIT 5,5
Top 11-15 songs/albums: LIMIT 10,5
etc...
person Marc B    schedule 05.04.2011
comment
Это была опечатка, я имел в виду: 0,5 или 5,5 или 10,5 ... Но это не работает, потому что я хочу получить результат (из таблицы песен): отдельные альбомы + неразличимые синглы (поскольку все синглы имеют один и тот же альбом, который равен [null])... Посмотрите на примеры таблиц результатов... - person Andy; 06.04.2011
comment
Учитывая, что у вас есть два несовместимых запроса, вы, вероятно, захотите сделать два отдельных запроса, объединить их, затем выбрать из этого результата и выполнить упорядочивание/ограничение этого родительского/внешнего запроса. - person Marc B; 06.04.2011
comment
Эта путаница является хорошей причиной для защиты LIMIT x OFFSET y вместо LIMIT y,x. - person staticsan; 06.04.2011
comment
как я могу это сделать с помощью PHP и MySQL? - person Andy; 06.04.2011

Вот мой быстрый удар по вашему вопросу, но я делаю некоторые огромные предположения.

Я считаю, что вы хотите, чтобы все альбомы и синглы были перечислены в порядке их выпуска, и вы хотите показывать 5 на "странице". Предполагая, что этот запрос должен работать. В долгосрочной перспективе я бы превратил это в представление.

SELECT "Name", "Date Released"
FROM (
    SELECT "Album ID" as "Name", "Date Released" FROM Albums
    UNION ALL
    SELECT "Song Name" as "Name", "Date Released" FROM Songs WHERE "Album ID" IS NULL
) as AlbumsAndSingles
ORDER BY "Date Released" ASC
LIMIT X,5

Затем, начиная с 0, увеличивайте X в приведенном выше запросе на 5 на каждой странице.

person Kevin Peno    schedule 05.04.2011
comment
да, вы меня правильно поняли, но это не сработает, если я хочу, чтобы альбом или сингл отображались только на одной странице... в примере, который я привел выше, на странице 1 есть два альбома и три песни, и это 6 строк в таблице песен, а на странице 4 есть еще два альбома и еще три песни, и это 9 строк в таблице песен, поэтому я не могу просто увеличить X на 5, потому что каждая страница получает строк больше или меньше 5... - person Andy; 06.04.2011
comment
Вы слишком усложняете мой ответ. Приведенный выше запрос возвращает только нулевые песни и альбомы. Неважно, состоит ли альбом из 14 песен или из 3. Этот запрос вернет альбомы и синглы (песни без альбома) в порядке выпуска, ограниченном и компенсированном вашими потребностями. - person Kevin Peno; 06.04.2011
comment
Я получаю сообщение об ошибке: #1248 - Каждая производная таблица должна иметь собственный псевдоним? - person Andy; 06.04.2011
comment
Извините, я забыл указать псевдоним. Может быть, мне следует проверить, прежде чем отвечать: P Я обновил свой ответ. - person Kevin Peno; 06.04.2011
comment
Спасибо, но есть еще одна проблема, таблицы не имеют одинаковых столбцов и имеют разное количество столбцов, и мне нужно больше столбцов из таблицы песен, чем из таблицы альбомов, Ошибка: # 1222 - Используемые операторы SELECT имеют другое количество столбцов..., есть ли решение для этого или я должен сделать столбцы в таблицах одинаковыми? - person Andy; 06.04.2011
comment
Вам нужно обновить свой вопрос, чтобы включить все необходимые столбцы. Однако я должен сказать, что вам, вероятно, следует пересмотреть свой выбор, если вы считаете, что вам нужно БОЛЬШЕ информации о песне, чем об альбоме. В случае этого текущего запроса я вижу, что вы просто используете тот факт, что песня является синглом, чтобы создать альбом на лету. Таким образом, ВСЕ результаты являются альбомами, ни одна из них не является песней. - person Kevin Peno; 06.04.2011
comment
Нет, я не хочу создавать альбом из песни на лету... мне нужно, например, продолжительность, время, размер... песни, но мне не нужно это из альбома... как вы думаете, что является лучшим решением для этой проблемы? - person Andy; 06.04.2011
comment
Из таблицы песен мне нужно: song_id1, song_id2, song_name, группа, Album_id2, time_released, жанр, текст, длина, размер, воспроизведение, лайки, антипатии, рейтинг. Из таблицы альбомов мне нужно: альбом_id1, альбом_ид2, название альбома, группа, время выпуска, длина, лайки, дизлайки, рейтинг. Обратите внимание, что если песня была в альбоме, информация об альбоме будет показана в результате, и информация, необходимая только для песен, не потребуется, в противном случае будет показана информация о песне с ее дополнительной информацией... - person Andy; 06.04.2011
comment
Обновите свой ответ, а не отвечайте здесь. Включите необходимую схему и столбцы, а также ожидаемые результаты. - person Kevin Peno; 06.04.2011