Выберите несколько строк через разные интервалы - PullRequest
1 голос
/ 11 января 2012

Можно ли выбрать одну строку в MySQL, пропустить 4 строки, пропустить 3 строки, пропустить 5 строк и выполнить цикл до конца таблицы?

Я нашел в Интернете некоторые учебники LIMIT и OFFSET, они работают, но хороши только для одного сета. Мне нужно несколько.

В настоящее время у меня есть эта настройка для работы в PHP, но я чувствую, что мой PHP-код раздут, потому что я знаю только базовый способ достижения этого.

Мой PHP-код выглядит следующим образом

    $int_count = 0;
$result = mysql_query("SELECT * FROM guitar_tunings_chords WHERE note_id >= '27'");
while ( $row = mysql_fetch_array($result) ) {

    if ($int_count == 0)$n_1 = ($row["note"]);
    if ($int_count == 4)$n_2 = ($row["note"]);
    if ($int_count == 7)$n_3 = ($row["note"]);
    if ($int_count == 12)$n_4 = ($row["note"]);
    if ($int_count == 16)$n_5 = ($row["note"]);
    if ($int_count == 19)$n_6 = ($row["note"]);
    if ($int_count == 24)$n_7 = ($row["note"]);
    if ($int_count == 28)$n_8 = ($row["note"]);
    if ($int_count == 31)$n_9 = ($row["note"]);
    if ($int_count == 36)$n_10 = ($row["note"]);
    if ($int_count == 40)$n_11 = ($row["note"]);
    if ($int_count == 43)$n_12 = ($row["note"]);
    if ($int_count == 48)$n_13 = ($row["note"]);
    if ($int_count == 52)$n_14 = ($row["note"]);

    $int_count++;   

    }

То, что я пытаюсь сделать, это выбрать только ноты Главной триады по мажорной шкале.

Мне нужно иметь возможность выбрать базовую ноту из таблицы, а затем выбрать с 3 различными интервалами для создания аккордов.


Обновление

            $result2 = mysql_query("SELECT * 
            FROM `guitar_tunings_links`
            JOIN guitar_tunings_chords ON guitar_tunings_links.".$funtion_string." = guitar_tunings_chords.note
            WHERE tuning =  '".$chrd_tn."'") or die(mysql_error());

                while ( $row = mysql_fetch_array($result2) ) {
                    $bridge_note = ($row["note_id"]);           
                }/*
                var_dump ($key_note);
                var_dump ($bridge_note);
                var_dump ($funtion_string);
                var_dump ($chrd_tn);*/
                    // SELECT * FROM `guitar_tunings_chords` WHERE `note_id` >= 28 LIMIT 0,8
                $result4 = mysql_query("SELECT * FROM `guitar_tunings_chords` WHERE `note_id` >= ".$bridge_note." LIMIT ".$tuning_capo.",8") or die(mysql_error());
                while ( $row = mysql_fetch_array($result4) ) {

                    //Notes
                    $note = ($row["note"]); 

                    // Replace # with z
                    $note = str_replace("#", "z", $note);

                    // Distinguish nut notes on or off
                    if (preg_match("/\b".$note."\b/i", $notes_array)) {
                        $n_nut_style = 'note_nut_on';
                    } else { $n_nut_style = 'note_nut_off'; 
                    }

                    // Distinguish fretboard notes on or off
                    if (preg_match("/\b".$note."\b/i", $notes_array)) {
                        $n_style = 'note_on';
                    } else { $n_style = 'note_off'; 
                    }

Ответы [ 3 ]

2 голосов
/ 12 января 2012

Вы должны применить это к вашим точным таблицам, но это должно работать довольно хорошо.

select * 
  from (select @i := @i+1 as count, 
               gtc.* from guitar_tunings_chords gtc
         where note_id >= 27) counts 
  join (select @i := -1 as counter) dummy
 where count % 12 = 0 
    or (count-4) % 12 = 0 
    or (count-7) % 12 = 0;

% 12 дает один полный цикл пропусков, -4 и -7 (и -0) - внутреннее смещение в каждом цикле.

0 голосов
/ 12 января 2012

Я мог бы рассмотреть возможность использования таблицы chord_note с интервалами (0,4,7,12,16,19 и т. Д.) И использовать ее как часть вашего SELECT, добавив начальное значение note_id (27) + записьв таблице chord_note

SELECT * 
  FROM guitar_tunings_chords 
 WHERE note_id IN ( SELECT 27+chord_interval 
                      FROM chord_note
                  )

Становясь более причудливым, вы даже можете расширить таблицу chord_note для хранения различных целочисленных деталей для разных шкал, просто изменив подвыбор

0 голосов
/ 11 января 2012

Попробуй это ... Я сам не пробовал, но у меня в голове это должно сработать:)

$row_count = 0;
$result = mysql_query("SELECT * FROM guitar_tunings_chords WHERE note_id >= '27'");
$notes = array(); // Notes array
$pattern = array(4,3,5); // Pattern to skip notes
$i = 0; // For pattern position
$first = true;
while ($row = mysql_fetch_array($result)) {
    if($first) { // Add the first note
        $notes[] = $row["note"];
        $first = false;
    } else {
        if($row_count == $pattern[$i]) {
            // Add note
            $notes[] = $row["note"];
            $i++; // Change pattern position
            // Jump to start of pattern
            if($i == 3)
                $i = 0;
            // Reset count
            $row_count = -1;
        }
    }
    $row_count++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...