ФорумРазработкаБазы данных → выбрать всех из таблицы по 2 признакам в определенном порядке

выбрать всех из таблицы по 2 признакам в определенном порядке

  • kikaha

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 23 января 2011 г. 14:38

    таблица переводчиков:

      `id` smallint(6) unsigned zerofill NOT NULL AUTO_INCREMENT,
    `added` date NOT NULL,
    `first_lang_id` smallint(3) NOT NULL,
    `second_lang_id` smallint(3) NOT NULL,

    added - дата добавления в БД
    first_lang_id, second_lang_id - соответственно id основного и второго (не всегда он есть) языков. кстати, в обоих полях может стоять одинаковый id - этого я не предусмотрел, ну да не суть

    задача - одним запросом сформировать массив, в котором сначала будет список перцев, владеющих указанным языком, как основным, а потом - остальных, у которых выбранный язык - второй, обе части массива хотелось бы отсортировать по дате добавления - чтобы первыми в списке выводились новички. зачем одним запросом - чтобы сделать LIMIT 0,10 и т.д. - для пагинации.

    мозг сломал. чую, что есть простое решение, помогите, плз!

  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 23 января 2011 г. 16:21, спустя 1 час 43 минуты 19 секунд

    мозг сломал

    Покажи над чем. Код в студию.
  • kikaha

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 23 января 2011 г. 18:45, спустя 2 часа 24 минуты 4 секунды


    Покажи над чем. Код в студию.


    //сначала получаем список переводчиков, у которых выбранный язык - основной
    $sql = ("SELECT * FROM $transtable WHERE first_lang_id='".$lang."' ORDER BY added DESC");
    $array = @$db->query($sql, 0);
    // и присоединяем к нему массив переводчиков, у которых выбранный язык - второй: для гарантированного приоритета первого языка в списке
    $sql = ("SELECT * FROM $transtable WHERE second_lang_id='".$lang."' ORDER BY added DESC");
    $array = array_merge((array)$array,(array)@$db->query($sql, 0));// (array) использовано для приведения типов, поскольку массивы в результатах выборки могут быть пустыми


    пока в базе сотня записей - можно брать их всех скопом и выдавать нужные куски из массива -1-10, 11-20 и т.д.. но поскольку кроме указанных полей там еще полдюжины интимных характеристик, то, не особо заморачиваясь, засовывать эту бодягу в массив при каждой выборке можно… только пока их немного.
    сейчас в базе около полутысячи - и более 300 знают английский, при запросе англичан уже начинаются чудеса с пожиранием памяти.
    я понимаю, что это костыль, его можно сделать более дубовым - делать 2 COUNT-а по каждой подгруппе, определять - на какой странице мы находимся, и в зависимости от этого запрашивать либо из первой, либо из второй подгруппы, либо остаток первой и начало второй в зависимости от циферок… но это костыль один хрен :(
  • kikaha

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 23 января 2011 г. 18:55, спустя 9 минут 37 секунд

    собсно, если не заморачиваться с порядком (сначала - только основной язык, а потом все остальные), то работает такая выборка:
    	$selectparam=" WHERE (first_lang_id='".$lid."' OR  second_lang_id='".$lid."') OR (first_lang_id='".$lid."' XOR  second_lang_id='".$lid."')";

    $sql = ("SELECT * FROM $transtable $selectparam ORDER BY added DESC LIMIT  $start,$per_page");

    вторая половина условия как раз, чтобы не пропустить тех умников, которые указали инглиш и основным, и вторым
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 23 января 2011 г. 19:36, спустя 41 минуту 34 секунды

    Если я правильно понял, то у тебя есть таблица с атрибутами:

    id | added | first_lang_id | second_lang_id | …

    И ты хочешь выводить всех переводчиков, причем выводить по страницам. + Ты хочешь, что бы сначала выводились с выбранным языком (что значит first_lang_id > 0 AND second_lang_id = 0 ?) + отсортировать их всех по дате.

    То есть всех сортировать по дате, но тех, у кого выбран основной язык (что значит выбран?) выводить первыми?


  • kikaha

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 23 января 2011 г. 20:11, спустя 34 минуты 58 секунд

    нет, не совсем так, я видно бестолково объяснил.
    каждый переводчик владеет, как правило, 2 языками - один основной, второй - кагбэ запасной, менее прокачанный, ну как у меня mysql :)
    например, айди языков - 1-английский, 2 - французский, 3 - немецкий, 4-испанский
    и вот таблица с переводчиками:
    id 101 , 102 ,103 , 104 , 105 (id самих переводчиков)
    first_lang_id 1 , 2 , 1 , 3 , 2 (id первого языка)
    second_lang_id 2 , 3 , 4 , 1 , 1 (id первого языка)

    тут у нас только 101 и 103 имеют английский основным, но если они заняты, и очень надо - можно выбрать 104 или 105 - у них английский второй
    а испанским никто не промышляет как основным, но у 103 он второй и его тоже можно припахать, коль нужда приспела

    таким образом, нам нужен запрос, в случае с английским языком, который сначала сделает выборку
    first_lang_id='1' ORDER BY added, потом такую же, но для неосновного языка
  • kikaha

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 23 января 2011 г. 20:33, спустя 21 минуту 18 секунд

    блин, в третьей строке
    second_lang_id 2 , 3 , 4 , 1 , 1 (id второго языка)

    конечно же, сорри!

Пожалуйста, авторизуйтесь, чтобы написать комментарий!