سؤال

لقد تعاملت فقط مع علاقات فردية في PHP حتى الآن، لكنني عالقة في مشكلة تتضمن علاقة واحدة إلى كثير. لقد كنت جالسا على هذا لبضعة أيام مع عدم وجود حظ، لذلك أنا يائسة لشخص ما خطوة ويظهر لي حلا قبل أن أفقد عقلي.

في قاعدة البيانات الخاصة بي تحتوي على سلسلة من عناوين URL، والتي يتم استلامها بواسطة استعلام محدد مع مختلف المجالات الأخرى، من جداول مختلفة. كل عنوان URL لديه فئة واحدة على الأقل مرتبطة به، ولكن يمكن أن يكون لها فئات متعددة. لذلك في نتائجي، قد أرى شيئا يشبه هذا:

link_id = 3   url= 'http://www.somesite1.com'   category = 'uncategorised'
link_id = 4   url= 'http://www.somesite2.com'   category = 'travel'
link_id = 4   url= 'http://www.somesite2.com'   category = 'fun'
link_id = 4   url= 'http://www.somesite2.com'   category = 'misc'
link_id = 3   url= 'http://www.somesite3.com'   category = 'uncategorised'

لقد حصلت على هذا للعمل، ونوع. عندما أقوم بإيقاف تشغيلها وطباعتها، استخدم مجموعة من الأحلام وجلب MySQL، فإن النتيجة تبدو تماما كما تفعل أعلاه. هذا رائع، إلا ما أحتاجه هو لقراءة شيء مثل:

link_id = 4   url = 'http://www.somesite2.com'   category = 'travel fun misc'

بحيث يتم دمج جميع الفئات لكل رابط في الأساس بشكل أساسي، حيث يتم طباعتها. قادتني أول محاولتي في تجربة متداخلة أثناء حلقة، لكنها لم تنجح ولست متأكدا مما إذا كان هذا ممكنا. بصرف النظر عن ذلك، أتساءل عما إذا كنت بحاجة إلى مجموعة متعددة الأبعاد (تخمين كامل، لم أجد أبدا لاستخدام واحد من قبل).

أنا أطلب هذه النتائج عن طريق رابط معرف على النحو الوارد أعلاه، لذلك أعرف ما إذا كان معرف الرابط في تكرار الحلقة الحالي، يطابق واحد في التكرار الأخير - ثم لدي شيء له أكثر من فئة واحدة .. أعتقد أنني قريب حقا، لكنني لا أستطيع معرفة ذلك.

أيه أفكار؟

هل كانت مفيدة؟

المحلول

هناك أيضا وظيفة "Group_Concat" في MySQL. يجب أن تفعل بالضبط ما تريد تحقيقه.

شيء مثل :

SELECT url, GROUP_CONCAT(category) AS categories FROM yourtable GROUP BY url 

نصائح أخرى

يجب أن تستخدم جدول اتصال.

1st لديك جدول الروابط

id = 1 url = something
id = 2 url = something else

ثم لديك جدول الفئات

id = 1 category = something
id = 2 category = something else

ثم لديك جدول اتصال

url_id = 1 category_id = 1
url_id = 1 category_id = 2
url_id = 2 category_id = 1

هذا يجب أن يبدأ تشغيلك على الأقل.

تحتاج إلى استخدام خوارزمية كسر التحكم.

set last_link variable to null
set combined_category to null
exec query

loop over result set {
    if last_link == null {
        last_link=fetch_link
    }
    if fetch_link==last_link {
        set combined_category+=ltrim(' '.fetch_category)
    } else {
        display html for last_link and combined_category
        set last_link=fetch_link
        set combined_category=fetch_category
    }
}//loop

display html for last_link and combined_category

لقد استخدمت "عرض HTML" كحدث عام "عمل" عام، فيمكنك دفع هذا إلى بنية صفيف، وما إلى ذلك بدلا من ذلك ...

استخدم مجموعة متنوعة من المعرف وعن url تتأكد من خلال القيم وأضفها على النحو التالي:

$link_categories[ $id ] .= $category." ";

$result = mysql_query("SElECT * FROM LINKS");

$link_categories = array();

while ($row = mysql_fetch_array($result,MYSQL_ASSOC))
{
    if (!isset($link_categories[$row['link']]))
        $link_categories[$row['link']] = " ";
    else
        $link_categories[$row['link']] .= " ";

    $link_categories[$row['link']] .= $row['category'];
}

print_r($link_categories);

النتائج في:

Array
(
    [http://a.com] =>  test evaluate performance
    [http://b.com] =>  classify reduce
    [http://c.com] =>  allocate
)

هذه ليست الطريقة "الصحيحة" للقيام بذلك - في الحقيقة يجب تحديد العلاقات في طاولة منفصلة مع علاقة واحدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top